使用 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】:
pathlib
有 glob
方法,我们可以在其中提供模式作为参数。
例如: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 递归遍历所有子目录的主要内容,如果未能解决你的问题,请参考以下文章