如何实现按字母数字顺序读取扁平目录文件的生成器?
按顺序遍历目录文件的生成器实现
场景说明
我有一个包含大量文件的扁平目录,文件结构如下:
myFolder: | 000001.csv | 000002.csv | 000003.csv ... | 100000.csv
需要按字母数字顺序读取这些文件并进行处理,常规实现方式是先把所有文件名排序后存入列表再遍历:
import os files = sorted(os.listdir(json_event_dir)) for file in files: # 注:原代码缺少路径拼接,补全后避免文件找不到的问题 full_path = os.path.join(json_event_dir, file) with open(full_path) as f: process(full_path)
但我不想存储整个files列表,是否可以实现一个按顺序遍历目录文件的生成器?
解决方案
当然可以实现,以下是两种实用方案:
方案1:简化版(避免显式存储列表)
如果只是不想在全局作用域留存完整的文件名列表,直接遍历sorted的返回结果即可——sorted内部会生成排序后的临时列表,但不会把它赋值给变量长期存储:
import os for file in sorted(os.listdir(json_event_dir)): full_path = os.path.join(json_event_dir, file) with open(full_path) as f: process(full_path)
方案2:封装为生成器函数
如果想把排序、路径拼接的逻辑封装起来,让代码更整洁,可以写一个生成器函数:
import os def sorted_dir_files(dir_path): # 先获取所有文件的文件名(排序必须依赖全部元素,所以无法完全流式获取) file_names = [entry.name for entry in os.scandir(dir_path) if entry.is_file()] # 按字母数字顺序排序后逐个生成完整路径 for name in sorted(file_names): yield os.path.join(dir_path, name) # 使用方式 for file_path in sorted_dir_files(json_event_dir): with open(file_path) as f: process(file_path)
额外说明
- 因为排序操作本身需要对比所有元素,所以无法做到完全流式的边读边排序输出,必须先获取所有文件名才能完成排序。
- 如果你的文件名是无前缀的数字格式(比如
1.csv、10.csv),字母排序会出现1.csv之后是10.csv的问题,这时候需要指定排序规则:
# 按文件名中的数字部分排序 sorted(file_names, key=lambda x: int(x.split('.')[0]))
内容的提问来源于stack exchange,提问作者Kamil Saitov
相关产品推荐
相关产品推荐

