使用pathlib递归迭代所有子目录。

170
如何使用pathlib来递归迭代给定目录下的所有子目录?
p = Path('docs')
for child in p.iterdir():
    # do things with child

只看起来遍历给定目录的直接子目录。
我知道可以使用`os.walk()`或`glob`来实现这一点,但我想使用pathlib,因为我喜欢使用路径对象进行操作。
6个回答

260
使用Path().rglob(在 Path().glob(" ** / * ") 中替代前导的 ** ):
path = Path("docs")
for p in path.rglob("*"):
     print(p.name)

139
你可以使用Path对象的glob方法:
p = Path('docs')
for i in p.glob('**/*'):
     print(i.name)

27
还有一个 rglob 方法,它会在模式前添加 **/ ,这样你就可以使用 p.rglob('*') 来完成了。 - stasdeep
14
好的,根据@pylang下面的回答是正确的。我认为修改我的回答会很失礼,因为他至今取得了不错的成就。 - Jacques Gaudin
10
你拥有高尚的品德,@JacquesGaudin。干杯! - pylang

14

仅查找文件夹的正确glob字符串为:

'**/'

要找到路径中所有文件夹的所有路径,请执行以下操作:

p = Path('docs')
for child in p.glob('**/'):
    print(child)

如果你只想要文件夹名称而不带路径,那么可以像这样打印文件夹的名称:

p = Path('docs')
for child in p.glob('**/'):
    print(child.name)

使用 rglob 查找文件夹:p.rglob("./") - normanius

8

pathlibglob 方法,我们可以将模式作为参数提供。

例如:Path('abc').glob('**/*.txt') - 它将递归地查找当前文件夹 abc 和所有其他子目录以定位所有的 txt 文件。


8
在Python 3.12中(截至本文撰写时尚未发布),您将能够使用pathlib.Path.walk()

8

使用列表推导式:

(1) [f.name for f in p.glob("**/*")]  # or
(2) [f.name for f in p.rglob("*")]

您可以在(1)或(2)中添加if f.is_file()if f.is_dir(),如果您只想针对文件或目录进行操作。或者将"*"替换为某些模式,如"*.txt",如果您只想针对.txt文件进行操作。
请参见此快速指南

4
使用列表推导的重点是什么?它如何补充现有答案? - Jacques Gaudin
2
我看了其他打印结果的答案,所以提供这个作为另一种选择。但你说得对,原帖没有明确说明需要它。 - dzenilee
我们也可以添加生成器表达式。 - MrR

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接