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

Pandas按重复列值拆分DataFrame合并数据批量导出CSV

老旧系统导出文件批量转结构化CSV实现方案

前置准备

先安装依赖库,终端执行命令:
pip install pandas

核心实现逻辑

整个流程分三步:拆分表定义块、匹配表头读原始数据、批量导出CSV,完整可运行代码如下,每一步都加了注释:

import pandas as pd
import os

# -------------------------- 配置项,按你的实际路径修改 --------------------------
def_file_path = "./definition.txt"  # definition.txt的实际存放路径
exp_file_root = "./exp_data"        # 所有expX.txt存放的文件夹路径
output_csv_dir = "./output_csv"     # 最终CSV要导出的目标文件夹路径
# -----------------------------------------------------------------------------

# 自动创建导出文件夹,文件夹已存在也不会报错
os.makedirs(output_csv_dir, exist_ok=True)

# 1. 读取表定义文件,保留所有空行(即Type=3的全空分隔行)
df_def = pd.read_csv(def_file_path, keep_default_na=True)

# 定位所有Type=3的分隔行位置,用于切分单个表的定义
separator_indexs = df_def[df_def["Type"] == 3].index.tolist()
# 补充分片的首尾位置,方便循环切分
split_poses = [-1] + separator_indexs + [len(df_def)]

# 2. 循环切分每个表的定义块
for i in range(1, len(split_poses)):
    start_pos = split_poses[i-1] + 1
    end_pos = split_poses[i]
    # 取出当前块,删除全空的无效行
    table_block = df_def.iloc[start_pos:end_pos].dropna(how="all")
    # 跳过切出来的空块(比如文件首尾多余空行导致的无效块)
    if len(table_block) == 0:
        continue
    # 校验块里是否有Type=1的元信息行,没有就跳过并提示
    type1_rows = table_block[table_block["Type"] == 1]
    if len(type1_rows) == 0:
        print(f"位置{start_pos}到{end_pos}的定义块无有效表元信息,已跳过")
        continue
    
    # 提取当前表的核心信息:对应exp文件名、按定义顺序排列的完整列名
    table_meta = type1_rows.iloc[0]
    exp_file_name = table_meta["Source"]
    table_columns = table_block["ColumnName"].tolist()

    # 3. 读取对应无表头的原始exp数据
    exp_file_path = os.path.join(exp_file_root, exp_file_name)
    # 跳过不存在的exp文件,避免程序直接崩溃
    if not os.path.exists(exp_file_path):
        print(f"表{exp_file_name}对应的数据文件不存在,已跳过")
        continue
    # 读取无表头的原始数据
    df_table = pd.read_csv(exp_file_path, header=None)
    # 给原始数据绑定正确列名,列数不匹配时给出提示方便排查
    if len(df_table.columns) != len(table_columns):
        print(f"警告:表{exp_file_name}原始数据列数({len(df_table.columns)})与定义列数({len(table_columns)})不匹配,请检查")
        continue
    df_table.columns = table_columns

    # 4. 导出为独立CSV,默认用exp文件名做CSV名避免重名
    csv_file_name = f"{os.path.splitext(exp_file_name)[0]}.csv"
    csv_save_path = os.path.join(output_csv_dir, csv_file_name)
    # 导出时不写入pandas自动生成的行索引,用utf-8-sig编码避免Windows下打开中文乱码
    df_table.to_csv(csv_save_path, index=False, encoding="utf-8-sig")
    print(f"已完成导出:{csv_file_name},共{len(df_table)}行数据")

常见问题排查

  • 如果读definition.txt或exp文件时报分隔符错误,在pd.read_csv()里加sep="\t"参数,老系统很多用制表符分隔而非逗号
  • 如果读文件报编码错误,尝试在pd.read_csv()里加encoding="gbk"参数,国内老旧系统普遍用GBK编码
  • 如果导出的CSV打开后列错位,先检查对应exp文件里是否有字段内容包含分隔符(比如逗号)未转义,这类脏数据需要单独清洗
  • 如果需要用主键名当CSV文件名,把导出时的csv_file_name改成f"{table_meta['ColumnName']}.csv"即可,注意提前排查有没有重名表

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 13:45:31