使用一个 glob.glob 代替多个 glob.glob

5

我有一个包含不同类型文件的文件夹。我只需要处理图像文件(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 更简单的函数可以使用?


1
抱歉,看起来它只支持简单的shell风格通配符。 - han solo
@hansolo 这样做有点违背全局匹配的初衷了... - bruno desthuilliers
1
如果我没记错的话,glob是不区分大小写的,所以至少你可以删除对"JPG"的检查,因为"jpg"已经包含了它。 - Kevin
@Kevin,恐怕你没有RC。 - bruno desthuilliers
@brunodesthuilliers,噢,可能是操作系统特定的。我在Windows上使用glob("*.txt")glob("*.TXT")返回相同的结果。 - Kevin
显示剩余3条评论
2个回答

4
使用 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
1
@singrium 阅读FineManual怎么样?https://docs.python.org/3/library/pathlib.html - bruno desthuilliers
1
这些在此处描述:https://docs.python.org/3/library/pathlib.html#pure-paths。它们是表示文件的跨平台独立方式。 - Alex
1
@brunodesthuilliers,我会查看文档。谢谢。 - singrium

3

您不能像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 :)

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