Reputation: 9635
How can I use pathlib
to recursively iterate over all subdirectories of a given directory?
p = Path('docs')
for child in p.iterdir():
# do things with child
only seems to iterate over the immediate children of a given directory.
I know this is possible with os.walk()
or glob
, but I want to use pathlib because I like working with the path objects.
Upvotes: 198
Views: 133082
Reputation: 44505
Use Path.rglob
(substitutes the leading **
in Path().glob("**/*")
):
path = Path("docs")
for p in path.rglob("*"):
print(p.name)
Upvotes: 299
Reputation: 518
As of Python 3.12 use pathlib.Path.walk()
import pathlib
path = pathlib.Path(r"E:\folder")
for root, dirs, files in path.walk():
print("Root: ")
print(root)
print("Dirs: ")
print(dirs)
print("Files: ")
print(files)
print("")
Upvotes: 21
Reputation: 369
To find just folders the right glob string is:
'**/'
So to find all the paths for all the folders in your path do this:
p = Path('docs')
for child in p.glob('**/'):
print(child)
If you just want the folder names without the paths then print the name of the folder like so:
p = Path('docs')
for child in p.glob('**/'):
print(child.name)
Upvotes: 19
Reputation: 368
Use list comprehensions:
(1) [f.name for f in p.glob("**/*")] # or
(2) [f.name for f in p.rglob("*")]
You can add if f.is_file()
or if f.is_dir()
to (1) or (2) if you want to target files only or directories only, respectively. Or replace "*"
with some pattern like "*.txt"
if you want to target .txt
files only.
See this quick guide.
Upvotes: 11
Reputation: 16958
You can use the glob
method of a Path
object:
p = Path('docs')
for i in p.glob('**/*'):
print(i.name)
Upvotes: 157
Reputation: 3051
pathlib
has glob
method where we can provide pattern as an argument.
For example : Path('abc').glob('**/*.txt')
- It will look for current folder abc
and all other subdirectories recursively to locate all txt
files.
Upvotes: 10