一、介绍
根据第一个CSV文件中的列名顺序来合并多个CSV文件,使它们按照指定的列名顺序进行排序,而不是直接堆叠排序。
二、详细代码
# -*- coding: utf-8 -*-
# @Time : 2025/03/04 08:53
# @Author : 哇咔咔哇咔
# @Email : yannbao@163.com
# @File : merge_csv_by_header.py
# @Software: PyCharm
# @Brief : 根据列名合并CSV文件(交互式)
import csv
from pathlib import Path
import shlex
def merge_csv_by_header():
"""交互式合并CSV文件(按列名智能对齐)"""
print("=== CSV列名合并工具 ===")
print("功能说明:")
print("1. 合并多个列名相同但顺序不同的CSV文件")
print("2. 合并后的列顺序以第一个文件为准")
print("3. 自动校验文件是否存在和列名一致性\n")
# 获取文件列表并验证存在性
while True:
raw_input = input("请输入要合并的文件路径(空格分隔): ").strip()
files = shlex.split(raw_input)
if not files:
print("错误:至少需要输入一个文件!")
continue
# 检查文件是否存在
missing = [f for f in files if not Path(f).exists()]
if missing:
print(f"× 以下文件不存在:{', '.join(missing)}")
print("请重新输入有效的文件列表。")
else:
break
# 读取首个文件的列结构
try:
first_file = files[0] # 正确获取第一个文件路径
with open(first_file, 'r', encoding='utf-8') as f:
reader = csv.DictReader(f)
base_columns = reader.fieldnames
print(f"\n首文件列结构:{', '.join(base_columns)}")
except Exception as e:
print(f"文件读取失败:{str(e)}")
return
# 列名一致性校验
total_files = len(files)
for i, file in enumerate(files[1:], 2):
try:
with open(file, 'r', encoding='utf-8') as f:
reader = csv.DictReader(f)
if set(reader.fieldnames) != set(base_columns):
print(f"× 文件 {i}/{total_files} 列名不匹配:{file}")
return
except Exception as e:
print(f"文件校验失败:{str(e)}")
return
# 获取输出路径
output = input("\n请输入输出文件路径(例如 merged.csv): ").strip()
while not output:
print("输出路径不能为空!")
output = input("请重新输入输出路径: ").strip()
# 执行合并操作
record_count = 0
with open(output, 'w', newline='', encoding='utf-8') as outfile:
writer = csv.DictWriter(outfile, fieldnames=base_columns)
writer.writeheader()
for idx, file in enumerate(files, 1):
print(f"\n▸ 正在处理文件 {idx}/{total_files}: {Path(file).name}")
with open(file, 'r', encoding='utf-8') as infile:
reader = csv.DictReader(infile)
for row_idx, row in enumerate(reader, 1):
writer.writerow(row)
record_count += 1
print(f" 已写入 {row_idx} 条记录")
print(f"\n✅ 合并完成!共处理 {record_count} 条记录")
print(f"输出文件:{Path(output).resolve()}")
if __name__ == '__main__':
merge_csv_by_header()
三、运行实例
=== CSV列名合并工具 ===
功能说明:
1. 合并多个列名相同但顺序不同的CSV文件
2. 合并后的列顺序以第一个文件为准
3. 自动校验文件是否存在和列名一致性
请输入要合并的文件路径(空格分隔): "D:\test\train-small.csv" "D:\test\valid-small.csv" "D:\test\test.csv"
首文件列结构:Image, Atelectasis, Cardiomegaly, Consolidation, Edema, Effusion, Emphysema, Fibrosis, Hernia, Infiltration, Mass, Nodule, PatientId, Pleural_Thickening, Pneumonia, Pneumothorax
请输入输出文件路径(例如 merged.csv): merged.csv
▸ 正在处理文件 1/3: train-small.csv
已写入 1000 条记录
▸ 正在处理文件 2/3: valid-small.csv
已写入 200 条记录
▸ 正在处理文件 3/3: test.csv
已写入 420 条记录
✅ 合并完成!共处理 1620 条记录
输出文件:D:\PycharmProjects\PracticalScript\merged.csv
进程已结束,退出代码0