有没有更好的方法来使用glob。Glob在python中获取多个文件类型的列表,如.txt, .mdown和.markdown?现在我有这样的东西:

projectFiles1 = glob.glob( os.path.join(projectDir, '*.txt') )
projectFiles2 = glob.glob( os.path.join(projectDir, '*.mdown') )
projectFiles3 = glob.glob( os.path.join(projectDir, '*.markdown') )

当前回答

一句俏皮话,只是为了好玩。

folder = "C:\\multi_pattern_glob_one_liner"
files = [item for sublist in [glob.glob(folder + ext) for ext in ["/*.txt", "/*.bat"]] for item in sublist]

输出:

['C:\\multi_pattern_glob_one_liner\\dummy_txt.txt', 'C:\\multi_pattern_glob_one_liner\\dummy_bat.bat']

其他回答

from glob import glob

files = glob('*.gif')
files.extend(glob('*.png'))
files.extend(glob('*.jpg'))

print(files)

如果你需要指定一个路径,循环匹配模式,并保持连接在循环中简单:

from os.path import join
from glob import glob

files = []
for ext in ('*.gif', '*.png', '*.jpg'):
   files.extend(glob(join("path/to/dir", ext)))

print(files)

你也可以像这样使用reduce():

import glob
file_types = ['*.txt', '*.mdown', '*.markdown']
project_files = reduce(lambda list1, list2: list1 + list2, (glob.glob(t) for t in file_types))

这将从glob.glob()为每个模式创建一个列表,并将它们简化为单个列表。

Glob返回一个列表:为什么不只是多次运行它并连接结果呢?

from glob import glob
project_files = glob('*.txt') + glob('*.mdown') + glob('*.markdown')

你可以用这个:

project_files = []
file_extensions = ['txt','mdown','markdown']
for file_extension in file_extensions:
    project_files.extend(glob.glob(projectDir  + '*.' + file_extension))

以下是Pat回答的一行列表理解变体(其中还包括您想要在特定的项目目录中glob):

import os, glob
exts = ['*.txt', '*.mdown', '*.markdown']
files = [f for ext in exts for f in glob.glob(os.path.join(project_dir, ext))]

循环遍历扩展名(对于extts中的ext),然后对于每个扩展名,使用匹配glob模式的每个文件(对于glob.glob中的f (os.path. path))。加入(project_dir ext))。

这个解决方案很短,没有任何不必要的for循环、嵌套的列表推导式或使代码混乱的函数。纯粹的,富有表现力的,蟒蛇式的禅宗。

这个解决方案允许您拥有一个自定义的文本列表,可以在不更新代码的情况下进行更改。(这是一个很好的实践!)

在Laurent的解决方案中使用了同样的列表理解(我投票支持)。但我认为,通常没有必要将单行分解为单独的函数,这就是为什么我提供这个作为替代解决方案的原因。

奖金:

如果你不仅需要搜索单个目录,还需要搜索所有子目录,你可以传递递归=True并使用多目录glob符号** 1:

files = [f for ext in exts 
         for f in glob.glob(os.path.join(project_dir, '**', ext), recursive=True)]

这将为每个扩展调用glob.glob('<project_dir>/**/*.txt', recursive=True)等等。

从技术上讲,** glob符号只是匹配一个或多个字符,包括正斜杠/(不像单数的* glob符号)。在实践中,您只需要记住,只要用斜杠(路径分隔符)包围**,它就可以匹配0个或多个目录。