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

时间:2018-03-01 10:17:08

标签: python-3.x glob hidden-files

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

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

我试图将点添加为可选字符无济于事。我真的很喜欢用glob而不是os.walk

3 个答案:

答案 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.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))

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