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

如何加快Python对含1万+CSV文件的文件夹排序并拼接最近20个文件的速度

性能优化方案

现有代码的核心问题

  • 1万+文件场景下,逐次调用os.path.getctime()会触发上万次独立的文件元数据IO查询,是耗时最久的核心原因
  • 排序逻辑错误:reverse=False为创建时间升序,取前20个是最旧的文件,不符合取最新20个的需求
  • 路径处理冗余:已经通过glob拿到文件全路径,额外的os.chdir、路径切分、重复路径拼接都是无效操作
  • DataFrame.append已被官方废弃,每次调用都会全量复制已有DataFrame,性能较差

优化后代码

import pandas as pd
import os

path = r'K:/industriel/abc/03_LOG/PRODUCTION/CSV/'

# 用os.scandir单次遍历即可获取所有文件元数据,不需要额外查询
csv_files = []
with os.scandir(path) as entries:
    for entry in entries:
        if entry.is_file() and entry.name.lower().endswith('.csv'):
            # 直接拿创建时间,不需要额外调用os.path.getctime
            csv_files.append((entry.stat().st_ctime, entry.path))

# 按创建时间降序排序,取最新的20个
csv_files.sort(reverse=True, key=lambda x: x[0])
latest_20 = [f[1] for f in csv_files[:20]]

# 用列表收集所有df后一次性合并,避免多次复制
df_list = []
for file_path in latest_20:
    df = pd.read_csv(file_path, delimiter=';', usecols=[0,1,3,4,9,10,20])
    df_list.append(df)

dfs = pd.concat(df_list, ignore_index=True)
print(dfs.head(10))

优化效果说明

  • os.scandir遍历1万+文件的速度比glob+逐次getctime快10~100倍,原5分钟的耗时可压缩到几秒内完成
  • 修正了排序逻辑,确保取到的是最新的20个CSV文件
  • 移除了所有冗余操作,合并逻辑替换为更高效的pd.concat,进一步降低耗时

内容的提问来源于stack exchange,提问作者Antho1400

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 03:39:03