【问题标题】:Python 3.6 glob include hidden files and foldersPython 3.6 glob 包含隐藏文件和文件夹
【发布时间】:2018-03-01 10:17:08
【问题描述】:

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

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

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

如何包含所有文件/文件夹,包括以. 开头的文件/文件夹,以及glob

【问题讨论】:

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


    【解决方案1】:

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

    files=[]
    file_refs = pathlib.Path(".").glob(pattern)
    for file in file_refs:
        files.append(str(file))
    

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

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

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

    【讨论】:

    • 这确实是我最终的结果,谢谢
    【解决方案2】:

    来自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']
    

    据我所知,它需要两个单独的 glob 来获得隐藏和非隐藏的,例如使用 https://stackoverflow.com/a/4829130/4130619

    【讨论】:

    • 你认为只有一个glob通过@reducingactivity 是可能的吗?
    【解决方案3】:

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

    正如@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))
    

    提供所有文件。

    【讨论】:

    • @Basj recursiveiglob 的函数参数,所以是的。
    • 它不能完全工作@ChenA.:假设你有.hello.dot/hello.txt.dot/.hello.txtnodot/hello.txtnodot/.hello.txt。那么itertools.chain(glob.iglob('**', recursive=True), glob.iglob('.**', recursive=True)) 不会全部取走。
    • 我明白了。在这种情况下,您需要迭代每个目录。
    • 我在您的回答@ChenA 中添加了这个重要说明(供未来的读者使用)。
    【解决方案4】:

    要查找匹配某个扩展名的隐藏文件,你可以试试这个

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

    如果要查找文件夹中的所有文件

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多