
本文介绍使用python内置csv模块合并csv中特定相邻行的方法,通过手动调用next()读取下一行并拼接指定列,确保输出列数与原始结构一致,同时提供安全的读写分离实践。
本文介绍使用python内置csv模块合并csv中特定相邻行的方法,通过手动调用next()读取下一行并拼接指定列,确保输出列数与原始结构一致,同时提供安全的读写分离实践。
在处理结构不规范的CSV数据时(如标题行与内容行分两行书写),常需将逻辑上属于同一记录的两行合并为一行,同时严格保持原有列数。例如原始数据:
Superman/, 250lbs, Batman/, 180lbs Clark Kent, , Bruce Wayne,
目标是将其合并为单行四列:
Superman/Clark Kent,250lbs,Batman/Bruce Wayne,180lbs
核心思路是按需预读:当检测到首列为 "Superman/" 的“主行”时,主动调用 next(reader) 获取下一行(即“子行”),并将对应列字符串拼接,再跳过该子行(避免重复写入)。
Miller (mlr) 是一个命令行工具,用于查询、整形和重新格式化名称索引数据,如 CSV、TSV、JSON 和 JSON Lines。它将 awk、sed、cut、join 和 sort 的功能整合到一个专为结构化数据处理而构建的单一工具中。
以下为推荐实现(含错误防护与最佳实践):
import csv
# 安全读写:输入与输出文件分离,避免原文件损坏
with (
open("input.csv", newline="") as f_in,
open("output.csv", "w", newline="") as f_out,
):
reader = csv.reader(f_in, skipinitialspace=True) # 自动去除字段前导空格
writer = csv.writer(f_out)
for row in reader:
# 判断是否为需合并的主行(可根据实际业务调整条件)
if len(row) >= 3 and row[0].strip().endswith("/"):
try:
next_row = next(reader) # 预读下一行
# 拼接第0列和第2列(索引从0开始),其余列保持不变
row[0] = row[0].rstrip("/") + next_row[0].strip()
if len(next_row) > 2:
row[2] = row[2].rstrip("/") + next_row[2].strip()
except StopIteration:
# 若主行后无子行,保留原样(防数据异常)
pass
writer.writerow(row)
关键注意事项:
- ✅ skipinitialspace=True 是必需参数,可自动清理字段前导空格(如 " Batman/" → "Batman/");
- ✅ 使用 with 上下文管理器确保文件正确关闭;
- ✅ 永远优先写入新文件(如 output.csv),验证无误后再替换原文件;
- ⚠️ next(reader) 会永久推进迭代器位置——若未配对出现主行/子行,需捕获 StopIteration 异常;
- ? 条件判断应增强鲁棒性(如检查 len(row) >= 3 防越界,用 .strip() 处理空白字符);
- ? 如需动态匹配多组行(不止 "Superman/"),可将判断逻辑封装为函数,或使用正则表达式识别模式。
最终生成的 output.csv 将严格保持4列结构,且无多余空格,可直接用于后续数据分析流程。










