一、代码概述
- 交互式操作:通过命令行问答方式引导用户操作
- 标题行智能处理:支持保留首个文件/全部文件的标题行
- 健壮性保障:自动校验文件有效性,防御性编程设计
- 透明化进度:实时显示文件处理进度和统计信息
二、代码
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")
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
while True:
output_file = input("请输入输出文件名(例如 merged.csv): ").strip()
if not output_file:
print("错误:输出文件名不能为空!")
else:
break
keep_headers = input("是否保留所有文件的标题行?[y/N](默认N): ").strip().lower()
include_all_headers = (keep_headers == 'y')
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