问题描述
我目前的目录结构如下:
/Users/user/dir/image.png
/Users/user/dir/sample.txt
/Users/user/dir/nested_dir/dir/dir/file.txt
/Users/user/dir/nested_dir1/dir2/dir3/file2.txt
我的目标是递归地在每个目录中进行挖掘,以获取所需的特定文件。问题是我还想在执行递归搜索的同时捕获“ image.png”以及不是目录的任何其他文件类型。
这是我目前拥有的:
for file in Path('/Users/user/dir').glob('**/'):
print(f'file:{file}')
然后会一直生成每个文件和文件夹,直到最后,但不是目录的项目都不会显示(image.py,sample.txt)。我也想捕获这些以供以后使用。有建议吗?
此外,我还尝试了以下方法:
for file in Path('/Users/user/dir').glob('*/'):
这确实给了我所要的内容,但是嵌套递归不起作用,只是给了我顶层目录。
解决方法
使用 **/*
作为模式:
>>> from pprint import pprint as pp >>> import pathlib as pl >>> >>> >>> p = pl.Path(".") >>> >>> old_way = list(p.glob("**/")) # Your way >>> pp(old_way) [WindowsPath('.'),WindowsPath('dir0'),WindowsPath('dir1'),WindowsPath('dir1/dir10')] >>> >>> new_way = list(p.glob("**/*")) >>> pp(new_way) [WindowsPath('dir0'),WindowsPath('file0.txt'),WindowsPath('dir0/file00.txt'),WindowsPath('dir1/dir10'),WindowsPath('dir1/file10.txt')] >>> >>> newer_way = [p] + list(p.glob("**/*")) # Prepend globed dir >>> pp(newer_way) [WindowsPath('.'),WindowsPath('dir1/file10.txt')]
这里是[Python.Docs]: pathlib - Path.glob(pattern)供参考。
,考虑使用os.walk
:
import os
all_files = []
for root,subdirs,files in os.walk("/Users/user/dir"):
all_files += [os.path.join(root,file) for file in files]
print(all_files)
,
您可以使用路径的rglob() method:
for path in Path('/Users/user/dir').rglob('*'):
if path.is_file():
print(path)
如果仅需要带有某种后缀的文件,请使用.rglob('*.*')