【Python】使用Python合并多个CSV文件(使用交互式进行垂直堆叠)

一、代码概述

  • 交互式操作:通过命令行问答方式引导用户操作
  • 标题行智能处理:支持保留首个文件/全部文件的标题行
  • 健壮性保障:自动校验文件有效性,防御性编程设计
  • 透明化进度:实时显示文件处理进度和统计信息

二、代码

# -*- coding: utf-8 -*-
# @Time    : 2025/03/01 18:33
# @Author  : 哇咔咔哇咔
# @Email   : yannbao@163.com
# @File    : merge_csv1.py
# @Software: PyCharm
# @Brief   : 交互式合并CSV文件工具

import csv
from pathlib import Path
import shlex

def merge_csv_interactive():
    """交互式合并CSV文件工具"""
    print("=== CSV文件合并工具 ===")
    print("说明:")
    print("1. 输入多个文件时用空格分隔(例如:file1.csv file2.csv)")
    print("2. 标题行处理选择:")
    print("   - 输入 y:保留所有文件的标题行")
    print("   - 输入 n 或直接回车:仅保留第一个文件的标题行\n")

    # 1. 获取并验证输入文件列表
    while True:
        raw_input = input("请输入要合并的CSV文件(以空格分隔): ").strip()
        input_files = shlex.split(raw_input)
        if not input_files:
            print("错误:至少需要输入一个文件!")
            continue

        # 检查所有文件是否存在
        missing_files = [f for f in input_files if not Path(f).exists()]
        if missing_files:
            print(f"错误:以下文件不存在 - {', '.join(missing_files)}")
            print("请重新输入有效的文件列表。")
        else:
            break

    # 2. 获取并验证输出文件名
    while True:
        output_file = input("请输入输出文件名(例如 merged.csv): ").strip()
        if not output_file:
            print("错误:输出文件名不能为空!")
        else:
            break

    # 3. 获取是否保留所有标题行的选择
    keep_headers = input("是否保留所有文件的标题行?[y/N](默认N): ").strip().lower()
    include_all_headers = (keep_headers == 'y')

    # 4. 执行合并操作
    total_files = len(input_files)
    header_written = False  # 标记是否已写入标题行

    with open(output_file, 'w', newline='', encoding='utf-8') as outfile:
        writer = csv.writer(outfile)

        # 遍历处理每个文件
        for idx, file_path in enumerate(input_files, 1):
            print(f"正在处理文件 [{idx}/{total_files}]: {file_path}")

            with open(file_path, 'r', newline='', encoding='utf-8') as infile:
                reader = csv.reader(infile)

                try:
                    header = next(reader)  # 尝试读取标题行
                except StopIteration:
                    print(f"警告:文件 {file_path} 为空,已跳过")
                    continue  # 跳过空文件

                # 写入标题行逻辑
                if not header_written or include_all_headers:
                    writer.writerow(header)
                    if not header_written:
                        header_written = True  # 第一个文件的标题行只写一次

                # 写入数据行
                for row in reader:
                    writer.writerow(row)

    print(f"\n合并完成!结果已保存至:{output_file}")


if __name__ == '__main__':
    merge_csv_interactive()

二、核心功能解析

1. 交互式输入处理

input_files = shlex.split(raw_input)
  • 技术亮点:使用shlex模块解析复杂路径
  • 支持格式:
    • 普通路径:D:\data\file.csv
    • 含空格路径:"D:\My Documents\data.csv"
    • 混合输入:file1.csv "file 2.csv" file3.csv

2. 文件有效性验证

missing_files = [f for f in input_files if not Path(f).exists()]
  • 防御机制:
    • 路径类型检查
    • 文件存在性验证
    • 空文件检测处理

3. 标题行处理逻辑

if not header_written or include_all_headers:
    writer.writerow(header)
  • 策略模式:
    • 首文件必写标题
    • 后续文件根据用户选择决定
  • 状态标记header_written控制首标题唯一性

4. 数据合并核心

for row in reader:
    writer.writerow(row)
  • 流式处理:逐行读写避免内存溢出
  • 编码处理:统一使用UTF-8编码

三、使用实例

=== CSV文件合并工具 ===
说明:
1. 输入多个文件时用空格分隔(例如:file1.csv file2.csv)
2. 标题行处理选择:
   - 输入 y:保留所有文件的标题行
   - 输入 n 或直接回车:仅保留第一个文件的标题行

请输入要合并的CSV文件(以空格分隔): "D:\test\train-small.csv" "D:\test\valid-small.csv" "D:\test\test.csv"
请输入输出文件名(例如 merged.csv): merged.csv
是否保留所有文件的标题行?[y/N](默认N): n
正在处理文件 [1/3]: D:\ASUS\桌面\打印\ytf\train-small.csv
正在处理文件 [2/3]: D:\ASUS\桌面\打印\ytf\valid-small.csv
正在处理文件 [3/3]: D:\ASUS\桌面\打印\ytf\test.csv

合并完成!结果已保存至:merged.csv

进程已结束,退出代码0

posted @   小白哇咔  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示