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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 19:06:04