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
相关产品推荐
相关产品推荐

