基于Pandas按CSV文件名前缀分类读取合并输出文件的实现问题
修复后的完整代码
import pandas as pd import os import glob def csv_upload(): folder_name = 'Torque and Drag' # 存放CSV文件的文件夹名称 file_type = 'csv' separator = ',' # 匹配目标文件夹下所有CSV文件 csv_file_pattern = os.path.join(folder_name, f"*.{file_type}") csv_files = glob.glob(csv_file_pattern) # 按文件名前缀自动分组存储文件路径 prefix_file_map = {} for file_path in csv_files: file_name = os.path.basename(file_path) prefix = file_name.split(" ")[0] if prefix not in prefix_file_map: prefix_file_map[prefix] = [] prefix_file_map[prefix].append(file_path) # 逐组合并输出 for prefix, file_list in prefix_file_map.items(): # 合并当前前缀下所有CSV内容 df_merged = pd.concat( [pd.read_csv(f, sep=separator) for f in file_list], ignore_index=True ) # 输出合并文件,仅保留一次表头,默认覆写最新合并结果 df_merged.to_csv(f"{prefix}.csv", index=False, encoding='utf-8-sig')
如果需要适配文件夹持续新增文件的增量更新场景,避免重复合并历史文件,可将输出部分替换为如下逻辑:
# 增量更新版本输出逻辑 for prefix, file_list in prefix_file_map.items(): df_merged = pd.concat( [pd.read_csv(f, sep=separator) for f in file_list], ignore_index=True ) output_path = f"{prefix}.csv" if os.path.exists(output_path): # 目标文件已存在,仅追加内容不写入表头 df_merged.to_csv(output_path, mode='a', header=False, index=False, encoding='utf-8-sig') else: # 目标文件不存在,新建文件并写入表头 df_merged.to_csv(output_path, index=False, encoding='utf-8-sig')
关键修改说明
- 新增自动分组逻辑:用字典存储前缀到对应文件列表的映射,自动识别所有符合命名规则的前缀,不需要硬编码指定PU/DA等分组,后续新增其他前缀的文件也能自动适配
- 修复原代码逻辑bug:原代码遍历文件时仅重复给文件名变量赋值,最终仅能拿到最后一个文件的前缀,新代码会对每个文件单独提取前缀并归类
- 表头去重处理:合并后统一输出仅保留一次表头,增量更新版本会自动判断目标文件是否存在,避免重复写入表头
- 跨操作系统兼容:使用os.path系列方法处理路径,避免Windows和Linux路径分隔符不兼容的问题
内容的提问来源于stack exchange,提问作者serdar_bay
相关产品推荐
相关产品推荐

