使用 pathlib 递归遍历所有子目录

Posted

技术标签:

【中文标题】使用 pathlib 递归遍历所有子目录【英文标题】:Recursively iterate through all subdirectories using pathlib 【发布时间】:2018-11-15 18:56:40 【问题描述】:

如何使用pathlib 递归迭代给定目录的所有子目录?

p = Path('docs')
for child in p.iterdir(): child

似乎只遍历给定目录的直接子级。

我知道 os.walk()glob 可以做到这一点,但我想使用 pathlib,因为我喜欢使用路径对象。

【问题讨论】:

【参考方案1】:

使用Path.rglob(替换Path().glob("**/*")中的前导**):

path = Path("docs")
for p in path.rglob("*"):
     print(p.name)

【讨论】:

【参考方案2】:

您可以使用Path 对象的glob 方法:

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

【讨论】:

还有一个rglob方法,就是在pattern前面加上**/,所以可以改成p.rglob('*') 是的,根据下面@pylang 的回答。认为更新我的更新是不礼貌的,因为他到目前为止取得了很好的成功。 你有正直的性格@JacquesGaudin。干杯。【参考方案3】:

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

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

【讨论】:

【参考方案4】:

要查找文件夹,正确的 glob 字符串是:

'**/'

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

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

如果您只想要没有路径的文件夹名称,那么打印文件夹的名称,如下所示:

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

【讨论】:

【参考方案5】:

使用列表推导:

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

如果您想分别仅定位文件或仅定位目录,则可以将if f.is_file()if f.is_dir() 添加到 (1) 或 (2)。或者如果您只想定位.txt 文件,则将"*" 替换为"*.txt" 之类的模式。

快速查看guide。

【讨论】:

使用列表理解有什么意义?这如何补充现有答案? 我正在查看打印结果的其他答案,因此我提供了它作为替代方案。但你是对的,原始帖子并没有明确说明它是需要的。

以上是关于使用 pathlib 递归遍历所有子目录的主要内容,如果未能解决你的问题,请参考以下文章

Python递归遍历目录下所有文件

递归的使用:遍历目录函数

java递归遍历目录获取所有文件及目录方案

递归查找目录下所有指定文件(包括深层目录)

Java中递归的优缺点,Java写一个递归遍历目录下面的所有文件包括子文件夹里边的文件。

python怎么用递归遍历多层目录树