2024-04-18 12:38:51 发布
网友
我正在尝试使用Python获取目录中的文件列表,但我不想要所有文件的列表。
我本质上想要的是能够做如下的事情,但是使用Python而不是执行ls。
ls 145592*.jpg
如果没有用于此操作的内置方法,我目前正在考虑编写一个for循环来遍历一个os.listdir()的结果,并将所有匹配的文件追加到一个新列表中。
os.listdir()
但是,这个目录中有很多文件,因此我希望有一个更有效的方法(或内置方法)。
^{}
glob.glob()绝对是这样做的(根据Ignacio)。但是,如果确实需要更复杂的匹配,可以使用列表理解和re.match()来完成,如下所示:
glob.glob()
re.match()
files = [f for f in os.listdir('.') if re.match(r'[0-9]+.*\.jpg', f)]
更灵活,但正如你所说,效率更低。
保持简单:
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)]
我更喜欢这种形式的列表理解,因为它在英语中读起来很好。
我把第四行读成: 对于os.listdir中我路径的每个fn,只给我与我包含的任何扩展匹配的那些。
对于新手python程序员来说,可能很难真正习惯使用列表理解进行过滤,对于非常大的数据集,它可能会有一些内存开销,但是对于列出目录和其他简单的字符串过滤任务,列表理解会导致更干净的文档代码。
这种设计的唯一优点是它不能防止您犯传递字符串而不是列表的错误。例如,如果您意外地将字符串转换为列表,并最终检查字符串的所有字符,则可能会得到大量的误报。
但有一个容易解决的问题总比一个难以理解的解决方案好。
^{}
glob.glob()
绝对是这样做的(根据Ignacio)。但是,如果确实需要更复杂的匹配,可以使用列表理解和re.match()
来完成,如下所示:更灵活,但正如你所说,效率更低。
保持简单:
我更喜欢这种形式的列表理解,因为它在英语中读起来很好。
我把第四行读成: 对于os.listdir中我路径的每个fn,只给我与我包含的任何扩展匹配的那些。
对于新手python程序员来说,可能很难真正习惯使用列表理解进行过滤,对于非常大的数据集,它可能会有一些内存开销,但是对于列出目录和其他简单的字符串过滤任务,列表理解会导致更干净的文档代码。
这种设计的唯一优点是它不能防止您犯传递字符串而不是列表的错误。例如,如果您意外地将字符串转换为列表,并最终检查字符串的所有字符,则可能会得到大量的误报。
但有一个容易解决的问题总比一个难以理解的解决方案好。
相关问题 更多 >
编程相关推荐