这是 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)
)。
这个解决方案简洁明了,没有任何不必要的嵌套循环、列表推导式或者函数来混淆代码。只有纯粹、表达能力强、Pythonic 的禅意。
该解决方案允许您自定义一个exts
列表,而无需更新代码即可更改。 (这是一种很好的实践!)
列表推导式与 Laurent 解决方案中使用的相同。但我认为,将单个行提取到单独的函数中通常是不必要的,这就是为什么我提供这个替代解决方案的原因。
额外奖励:
如果您不仅需要搜索单个目录,还需要搜索所有子目录,则可以传递recursive=True
并使用多目录通配符**
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 技术上,
**
通配符仅匹配一个或多个字符,包括正斜杠
/
(与单数的
*
通配符不同)。实际上,只需要记住只要在
**
周围加上正斜杠(路径分隔符),它就匹配零个或多个目录。
main_file = projectFiles1 + projectFiles2 + projectFiles3
呢?这样也可以通过连接生成包含所有类型的主列表。 - Delrius Euphoria