【问题标题】:Python - Glob to recursively dig through directoriesPython - Glob 递归地挖掘目录
【发布时间】:2020-10-01 20:20:27
【问题描述】:

我目前的目录结构如下:

/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('*/'):

这确实给了我我要求的项目,但是嵌套递归不起作用,只是给了我顶级目录。

【问题讨论】:

  • 您是否尝试过使用os.walk?这将为您从目录中分离出文件,并进行递归。

标签: python glob


【解决方案1】:

使用 **/* 作为模式:

>>> 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('dir1'),
 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('dir0'),
 WindowsPath('dir1'),
 WindowsPath('file0.txt'),
 WindowsPath('dir0/file00.txt'),
 WindowsPath('dir1/dir10'),
 WindowsPath('dir1/file10.txt')]

这里是[Python.Docs]: pathlib - Path.glob(pattern) 供参考。

【讨论】:

  • 事实证明,我实际上需要父目录(如“您的方式”部分中的第一项所示)。我如何将您的方式合并到上面效果很好,但是我还想看看我正在寻找的目录?
  • 只需将当前路径添加到列表中。编辑了答案。
【解决方案2】:

考虑使用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)

【讨论】:

  • 这可能是一个足够的解决方法,但glob 应该能够自行完成。
猜你喜欢
  • 2010-09-06
  • 2019-06-07
  • 1970-01-01
  • 1970-01-01
  • 2014-03-17
  • 1970-01-01
  • 2018-07-17
  • 1970-01-01
  • 2011-11-12
相关资源
最近更新 更多