Python glob 包含隐藏文件和文件夹

19

我试图循环遍历所有匹配特定扩展名的文件,包括隐藏文件夹中的文件。到目前为止,我还没有找到使用iglob实现这一点的方法。但是这对于除了以点开头的文件夹之外的所有文件夹都有效:

import glob
for filename in glob.iglob('/path/**/*.ext', recursive=True):
    print(filename)

我尝试将点作为可选字符添加,但无济于事。我真的很想使用 glob 而不是寄托于 os.walk

如何使用 glob 包含所有文件/文件夹,即使以 . 开头?

5个回答

12

我遇到了同样的问题,希望 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
这确实基本上就是我最终得到的结果,谢谢。 - SeeDoubleYou
我想知道Path.rglob()是否具有相同的行为... - pepoluan

8

来自 https://docs.python.org/3/library/glob.html

需要注意的是,与fnmatch.fnmatch()不同,glob将以点(.)开头的文件名视为特殊情况。

If the directory contains files starting with . they won’t be matched by default. For example, consider a directory containing card.gif and .card.gif:

import glob  
glob.glob('*.gif') # ['card.gif']  
glob.glob('.c*') # ['.card.gif']

从我看到的情况来看,需要使用两个单独的glob来获取隐藏和非隐藏的内容,例如使用 https://dev59.com/_G455IYBdhLWcg3wD_oB#4829130


你认为只通过一次 glob 通行,就能实现 @reducingactivity 的目标吗? - Basj

5

从 Python 3.11 开始,可以进行以下操作:

glob.iglob('/path/*', include_hidden=True)

5

为赏金问题添加答案;在一个单一的命令中获得隐藏文件和非隐藏文件的结果。

正如@reducidng activity所提到的,glob将.文件视为特殊情况。为了在单个循环中获取常规文件和隐藏文件,我们可以使用itertools.chainglob.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.txtnodot/hello.txtnodot/.hello.txt,那么这两个都不行:
itertools.chain(glob.iglob('**', recursive=True), glob.iglob('.**', recursive=True))

nor

itertools.chain(glob.iglob('**/*', recursive=True), glob.iglob('.**/*', recursive=True))

给出所有文件。

@Basj recursiveiglob的一个函数参数,所以它有效。 - Chen A.
它无法完全工作 @ChenA.:假设您有.hello.dot/hello.txt.dot/.hello.txtnodot/hello.txtnodot/.hello.txt。然后,itertools.chain(glob.iglob('**', recursive=True), glob.iglob('.**', recursive=True))并不会获取所有这些文件。 - Basj
我明白了。在这种情况下,您需要迭代每个目录。 - Chen A.
1
我在你的回答@ChenA中添加了这个重要的注释(供未来读者参考)。 - Basj

-1

要查找与特定扩展名匹配的隐藏文件,您可以尝试这样做

glob.glob('/path/**/.*.ext')

如果你想在一个文件夹中找到所有的文件

glob.glob('/path/*') + glob.glob('/path/.*')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接