有没有更好的方法来使用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') )

当前回答

以下是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个或多个目录。

其他回答

你可以使用filter:

import os
import glob

projectFiles = filter(
    lambda x: os.path.splitext(x)[1] in [".txt", ".mdown", ".markdown"]
    glob.glob(os.path.join(projectDir, "*"))
)

您可以尝试制作一个手动列表,将现有扩展与所需扩展进行比较。

ext_list = ['gif','jpg','jpeg','png'];
file_list = []
for file in glob.glob('*.*'):
  if file.rsplit('.',1)[1] in ext_list :
    file_list.append(file)

这招对我很管用:

import glob
images = glob.glob('*.JPG' or '*.jpg' or '*.png')

我也有同样的问题,这是我想到的

import os, sys, re

#without glob

src_dir = '/mnt/mypics/'
src_pics = []
ext = re.compile('.*\.(|{}|)$'.format('|'.join(['png', 'jpeg', 'jpg']).encode('utf-8')))
for root, dirnames, filenames in os.walk(src_dir):
  for filename in filter(lambda name:ext.search(name),filenames):
    src_pics.append(os.path.join(root, filename))

也许我遗漏了一些东西但如果只是简单的glob也许你可以这样做?

projectFiles = glob.glob(os.path.join(projectDir, '*.{txt,mdown,markdown}'))