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

其他回答

你可以使用filter:

import os
import glob

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

df1 = pd.DataFrame(columns=['A'])
for i in glob.glob('C:\dir\path\*.txt'):
    df1 = df1.append({'A': i}, ignore_index=True)
for i in glob.glob('C:\dir\path\*.mdown'):
    df1 = df1.append({'A': i}, ignore_index=True)
for i in glob.glob('C:\dir\path\*.markdown):
    df1 = df1.append({'A': i}, ignore_index=True)

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

链接结果:

import itertools as it, glob

def multiple_file_types(*patterns):
    return it.chain.from_iterable(glob.iglob(pattern) for pattern in patterns)

然后:

for filename in multiple_file_types("*.txt", "*.sql", "*.log"):
    # do stuff

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

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)