如何加快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
相关产品推荐
相关产品推荐

