【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
本文来自博客园,作者:小白哇咔,除特殊说明外,转载请注明原文链接:https://www.cnblogs.com/wkkwk/p/18750077
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人