You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现按字母数字顺序读取扁平目录文件的生成器?

按顺序遍历目录文件的生成器实现

场景说明

我有一个包含大量文件的扁平目录,文件结构如下:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 21:10:13