【问题标题】:Use one glob.glob instead of multiple glob.glob [duplicate]使用一个 glob.glob 而不是多个 glob.glob [重复]
【发布时间】:2019-07-06 07:44:18
【问题描述】:

我有一个包含不同类型文件的文件夹。我只需要处理图像文件(jpg, png, jpeg, JPG, ...)。为此,我使用 glob.glob 仅获取具有 'jpg'、'png'、... 扩展名的文件。
问题是我必须多次使用glob.glob(与图像扩展号一样多)才能获取所有图像:

import glob
images = glob.glob('tests/*.jpg') + glob.glob('tests/*.jpeg') + glob.glob('tests/*.png') + glob.glob('tests/*.JPG')  

有没有办法以更优化的形式使用glob.glob(类似于glob.glob('path/*.{'jpg', 'png', 'jpeg', 'JPG'}),或者有没有更简单的函数来代替glob

【问题讨论】:

  • glob.glob('tests/*.{jpg, png, JPG}') 返回一个空列表
  • 抱歉,好像只支持简单的shell风格的通配符
  • 虽然你可以做类似[x for x in glob.glob('*') if os.path.splitext(x)[1] in ['.txt', '.jpg', '.png'] ] :)
  • @hansolo 这种打败 glob 的整个点...
  • IIRC glob 不区分大小写,因此至少您可以取消对“JPG”的检查,因为“jpg”会覆盖它。

标签: python python-3.x glob


【解决方案1】:

你不能像glob.glob('*.{JPG, png..}) 这样复杂的通配符通配符,因为, 如果你看一下你会看到的源代码,

def glob(pathname):
    """Return a list of paths matching a pathname pattern.
    ....
    """
    return list(iglob(pathname))

然后如果你找到iglob的来源你就会看到,

def iglob(pathname):
    ....
    ....
    dirname, basename = os.path.split(pathname)

    # voila, here, our complex glob wildcard will certainly break, and can't be used :)

因此,您只能使用glob 做简单的globbing :)

【讨论】:

    【解决方案2】:

    使用pathlib

    from pathlib import Path
    
    extensions = ['.jpg', '.png', '.jpeg']
    images = [x for x in Path('tests').iterdir() if x.suffix.lower() in extensions]
    

    【讨论】:

    • 当我运行你建议的代码时,我得到了这个输出:[PosixPath('tests/a.jpg'), PosixPath('tests/b.jpg'), PosixPath('tests/d.png'), PosixPath('tests/e.jpeg'), PosixPath('tests/c.JPG')] PosixPath() 代表什么?
    • @singrium 阅读 FineManual 怎么样? docs.python.org/3/library/pathlib.html
    • 这里描述了这些:docs.python.org/3/library/pathlib.html#pure-paths。它们是一种独立于平台的文件表示方式。
    • @brunodesthuilliers,我会看一下文档。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2013-11-08
    • 1970-01-01
    • 1970-01-01
    • 2020-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-10
    相关资源
    最近更新 更多