【Python】使用Python合并多个CSV文件(使用交互式根据列名合并)

一、介绍

根据第一个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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哇咔咔哇咔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值