summaryrefslogtreecommitdiffstats
path: root/Lib/pathlib.py
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/pathlib.py')
-rw-r--r--Lib/pathlib.py43
1 files changed, 43 insertions, 0 deletions
diff --git a/Lib/pathlib.py b/Lib/pathlib.py
index 62dd0fa..2aee717 100644
--- a/Lib/pathlib.py
+++ b/Lib/pathlib.py
@@ -1321,6 +1321,49 @@ class Path(PurePath):
return self
+ def walk(self, top_down=True, on_error=None, follow_symlinks=False):
+ """Walk the directory tree from this directory, similar to os.walk()."""
+ sys.audit("pathlib.Path.walk", self, on_error, follow_symlinks)
+ return self._walk(top_down, on_error, follow_symlinks)
+
+ def _walk(self, top_down, on_error, follow_symlinks):
+ # We may not have read permission for self, in which case we can't
+ # get a list of the files the directory contains. os.walk
+ # always suppressed the exception then, rather than blow up for a
+ # minor reason when (say) a thousand readable directories are still
+ # left to visit. That logic is copied here.
+ try:
+ scandir_it = self._scandir()
+ except OSError as error:
+ if on_error is not None:
+ on_error(error)
+ return
+
+ with scandir_it:
+ dirnames = []
+ filenames = []
+ for entry in scandir_it:
+ try:
+ is_dir = entry.is_dir(follow_symlinks=follow_symlinks)
+ except OSError:
+ # Carried over from os.path.isdir().
+ is_dir = False
+
+ if is_dir:
+ dirnames.append(entry.name)
+ else:
+ filenames.append(entry.name)
+
+ if top_down:
+ yield self, dirnames, filenames
+
+ for dirname in dirnames:
+ dirpath = self._make_child_relpath(dirname)
+ yield from dirpath._walk(top_down, on_error, follow_symlinks)
+
+ if not top_down:
+ yield self, dirnames, filenames
+
class PosixPath(Path, PurePosixPath):
"""Path subclass for non-Windows systems.