这是Pat回答的单行列表理解变体(其中还包括您要在特定项目目录中使用的方式):
import os, glob
exts = ['*.txt', '*.mdown', '*.markdown']
files = [f for ext in exts for f in glob.glob(os.path.join(project_dir, ext))]
遍历扩展名(for ext in exts
),然后为每个扩展名获取与glob模式匹配的每个文件(for f in glob.glob(os.path.join(project_dir, ext)
)。
该解决方案很短,并且没有任何不必要的for循环,嵌套列表理解或使代码混乱的功能。纯粹,富有表现力的Pythonic Zen。
此解决方案使您可以自定义列表 exts
可以更改而不必更新代码。(这始终是一个好习惯!)
列表理解与Laurent的解决方案(我投票赞成)中使用的相同。但是我认为通常不需要将单行分解为一个单独的函数,这就是为什么我将其作为替代解决方案。
奖金:
如果您不仅需要搜索单个目录,还需要搜索所有子目录,则可以传递recursive=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)
每个扩展,依此类推。
1从技术上讲,**
全局符号仅与一个或多个字符(包括正斜杠) 匹配/
(不同于单个*
全局符号)。实际上,您只需要记住,只要**
用正斜杠(路径分隔符)括起来,它就会匹配零个或多个目录。