【发布时间】:2018-11-15 18:56:40
【问题描述】:
如何使用pathlib 递归迭代给定目录的所有子目录?
p = Path('docs')
for child in p.iterdir(): child
似乎只遍历给定目录的直接子级。
我知道 os.walk() 或 glob 可以做到这一点,但我想使用 pathlib,因为我喜欢使用路径对象。
【问题讨论】:
标签: python python-3.x pathlib
如何使用pathlib 递归迭代给定目录的所有子目录?
p = Path('docs')
for child in p.iterdir(): child
似乎只遍历给定目录的直接子级。
我知道 os.walk() 或 glob 可以做到这一点,但我想使用 pathlib,因为我喜欢使用路径对象。
【问题讨论】:
标签: python python-3.x pathlib
使用Path.rglob(替换Path().glob("**/*")中的前导**):
path = Path("docs")
for p in path.rglob("*"):
print(p.name)
【讨论】:
您可以使用Path 对象的glob 方法:
p = Path('docs')
for i in p.glob('**/*'):
print(i.name)
【讨论】:
rglob方法,就是在pattern前面加上**/,所以可以改成p.rglob('*')。
pathlib 有 glob 方法,我们可以在其中提供模式作为参数。
例如:Path('abc').glob('**/*.txt') - 它将递归查找当前文件夹 abc 和所有其他子目录以定位所有 txt 文件。
【讨论】:
要查找文件夹,正确的 glob 字符串是:
'**/'
因此,要查找路径中所有文件夹的所有路径,请执行以下操作:
p = Path('docs')
for child in p.glob('**/'):
print(child)
如果您只想要没有路径的文件夹名称,那么打印文件夹的名称,如下所示:
p = Path('docs')
for child in p.glob('**/'):
print(child.name)
【讨论】:
使用列表推导:
(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。
【讨论】: