获取目录中筛选后的文件列表

433 投票
14 回答
623895 浏览
提问于 2025-04-15 19:02

我想用Python获取一个文件夹里的文件列表,但我不想要所有的文件。

我其实想要的是能做到类似下面这样的事情,但用Python来实现,而不是执行ls命令。

ls 145592*.jpg

如果没有现成的方法可以用,我现在在考虑写一个for循环,遍历os.listdir()的结果,然后把所有匹配的文件添加到一个新的列表里。

不过,那个文件夹里有很多文件,所以我希望能有一个更高效的方法(或者是一个现成的方法)。

14 个回答

88

保持简单:

import os
relevant_path = "[path to folder]"
included_extensions = ['jpg','jpeg', 'bmp', 'png', 'gif']
file_names = [fn for fn in os.listdir(relevant_path)
              if any(fn.endswith(ext) for ext in included_extensions)]

我更喜欢这种列表推导的写法,因为它读起来像英语一样顺畅。

我把第四行理解为:对于我路径下的每一个文件名,给我那些符合我指定的扩展名的文件。

对于初学Python的程序员来说,习惯使用列表推导来过滤数据可能有点难,而且在处理非常大的数据集时,它可能会占用更多内存。不过,对于列出目录和其他简单的字符串过滤任务,列表推导能让代码更简洁、易于理解。

这个设计唯一的问题是,它不能防止你犯错,比如把一个字符串传给它,而不是一个列表。例如,如果你不小心把一个字符串转换成了列表,结果检查的是字符串中的每个字符,那你可能会得到很多错误的结果。

但有一个容易解决的问题,总比一个难以理解的解决方案要好。

183

glob.glob() 绝对是解决这个问题的好方法(正如Ignacio所说)。不过,如果你需要更复杂的匹配,可以使用列表推导和 re.match() 来实现,像这样:

files = [f for f in os.listdir('.') if re.match(r'[0-9]+.*\.jpg', f)]

这种方法更灵活,但正如你所提到的,它的效率会稍微低一些。

609
import glob

jpgFilenamesList = glob.glob('145592*.jpg')

查看 glob 在 Python 文档中的介绍

撰写回答