获取目录中筛选后的文件列表
我想用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 文档中的介绍