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

See*_*You 6 glob hidden-files python-3.x

我尝试遍历与某个扩展名匹配的所有文件,包括隐藏文件夹中的文件。到目前为止,我还没有找到使用iglob的方法。这适用于除以点开头的所有文件夹之外的所有文件夹:

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

我试图将点添加为可选字符无济于事。我真的很想使用glob而不是驻留在os.walk上

wat*_*ice 7

我有同样的问题,并希望 glob.glob 有一个可选参数来包含点文件。我希望能够在所有目录中包含所有点文件,包括以点开头的目录。使用 glob.glob 无法做到这一点。但是我发现 Python 有 pathlib 标准模块,它有一个以不同方式运行的 glob 函数,它将包含点文件。该函数的操作略有不同,特别是它不返回字符串列表,而是返回路径对象。但是我使用了以下内容

files=[]
file_refs = pathlib.Path(".").glob(pattern)
for file in file_refs:
    files.append(str(file))
Run Code Online (Sandbox Code Playgroud)

我发现的另一个显着差异是以 ** 结尾的全局模式。这在 pathlib 版本中没有返回任何内容,但会返回 glob.glob 中的所有文件。为了获得相同的结果,我添加了一行来检查模式是否以 ** 结尾,如果是,则将 /* 附加到它。

以下代码替换了您的示例,其中包含以点开头的目录中的文件

import pathlib
for fileref in pathlib.Path('/path/').glob('**/*.ext'):
    filename = str(fileref)
    print(filename)
Run Code Online (Sandbox Code Playgroud)


小智 6

从 python 3.11 开始,可以执行以下操作:

glob.iglob('/path/*', include_hidden=True)
Run Code Online (Sandbox Code Playgroud)


Mat*_*zny 5

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

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

如果目录包含以 . 默认情况下它们不会匹配。例如,考虑一个包含 card.gif 和 .card.gif 的目录:

import glob  
glob.glob('*.gif') # ['card.gif']  
glob.glob('.c*') # ['.card.gif']
Run Code Online (Sandbox Code Playgroud)

从我看来,它需要两个单独的 glob 来获取隐藏和非隐藏的 glob,例如使用/sf/answers/338039131/


Che*_* A. 5

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

\n

正如 @reducidng 活动提到的, glob 对待 . 文件作为特殊用例。要在单个循环中同时获取常规文件和隐藏文件,我们可以itertools.chain使用glob.iglob器。例如,

\n
\xe2\x86\x92 ls -A\n.chen     file.text so1.py\n\n>>> import glob, itertools\n>>> for i in itertools.chain(glob.iglob('**'), glob.iglob('.**')):\n...     print(i)\n...\nfile.text\nso1.py\n.chen\n\n# If you want it as a variable, you can list() it.\n>>> l = list(itertools.chain(glob.iglob('**'), glob.iglob('.**')))\n>>> l\n['file.text', 'so1.py', '.chen']\n>>>\n
Run Code Online (Sandbox Code Playgroud)\n

注意:它还不能完全工作。假设你有.hello, .dot/hello.txt, .dot/.hello.txt, nodot/hello.txt,nodot/.hello.txt您那么两者都不是:

\n
itertools.chain(glob.iglob('**', recursive=True), glob.iglob('.**', recursive=True))\n
Run Code Online (Sandbox Code Playgroud)\n

也不

\n
itertools.chain(glob.iglob('**/*', recursive=True), glob.iglob('.**/*', recursive=True))\n
Run Code Online (Sandbox Code Playgroud)\n

给出所有文件。

\n