我尝试遍历与特定扩展名匹配的所有文件,包括隐藏文件夹中的文件。到目前为止,我还没有找到使用iglob做到这一点的方法。 这适用于除以点开头的所有文件夹:
import glob
for filename in glob.iglob('/path/**/*.ext', recursive=True):
print(filename)
我试图将点添加为可选字符无济于事。我真的很喜欢用glob而不是os.walk
答案 0 :(得分:1)
我遇到了同样的问题,希望glob.glob具有一个可选参数来包含点文件。我希望能够在所有目录中包括所有点文件,包括以点开头的目录。使用glob.glob不可能做到这一点。但是我发现Python具有pathlib标准模块,该模块具有glob函数,该函数的操作方式有所不同,它将包含点文件。该函数的操作稍有不同,特别是它不返回字符串列表,而是返回路径对象。但是我使用了以下
files=[]
file_refs = pathlib.Path(".").glob(pattern)
for file in file_refs:
files.append(str(file))
我发现的另一个显着差异是以**结尾的全局模式。这在pathlib版本中不返回任何内容,但将返回glob.glob中的所有文件。为了获得相同的结果,我添加了一行以检查模式是否以**结尾,如果是,则在其后附加/*。
以下代码替换了您的示例,该示例包括以点开头的目录中的文件
import pathlib
for fileref in pathlib.Path('/path/').glob('**/*.ext'):
filename = str(fileref)
print(filename)
答案 1 :(得分:1)
为悬赏问题添加答案;只需一个命令即可获得隐藏文件和非隐藏文件的结果。
正如@reducidng活动提到的那样,glob对待。文件作为特殊用例。要在一个循环中同时获取常规文件和隐藏文件,我们可以将itertools.chain
与glob.iglob
迭代器一起使用。例如,
→ ls -A
.chen file.text so1.py
>>> import glob, itertools
>>> for i in itertools.chain(glob.iglob('**'), glob.iglob('.**')):
... print(i)
...
file.text
so1.py
.chen
# If you want it as a variable, you can list() it.
>>> l = list(itertools.chain(glob.iglob('**'), glob.iglob('.**')))
>>> l
['file.text', 'so1.py', '.chen']
>>>
注意:它还不能完全正常工作。假设您有.hello
,.dot/hello.txt
,.dot/.hello.txt
,nodot/hello.txt
,nodot/.hello.txt
。然后都不是:
itertools.chain(glob.iglob('**', recursive=True), glob.iglob('.**', recursive=True))
也
itertools.chain(glob.iglob('**/*', recursive=True), glob.iglob('.**/*', recursive=True))
提供所有文件。
答案 2 :(得分:0)
来自https://docs.python.org/3/library/glob.html
如果目录包含以。开头的文件。他们不会匹配 默认情况下。例如,考虑一个包含card.gif和的目录 .card.gif:
导入glob
glob.glob(' * .gif')#[' card.gif']
glob.glob(' .c *')#[' .card.gif']
从我看到它需要两个单独的glob来获取隐藏的而不是隐藏的,例如使用https://stackoverflow.com/a/4829130/4130619。