如何将CSV文件中相邻两行按列合并且保持列数不变

作者:袖梨 2026-07-14

本文介绍使用python标准csv模块将csv中特定模式的相邻两行按列合并(如将"superman/"与下一行的"clark kent"拼接为"superman/clark kent"),同时严格保持原有列数,适用于需精准对齐字段的清洗场景。

本文介绍使用python标准csv模块将csv中特定模式的相邻两行按列合并(如将"superman/"与下一行的"clark kent"拼接为"superman/clark kent"),同时严格保持原有列数,适用于需精准对齐字段的清洗场景。

在处理结构化CSV数据时,有时会遇到“分两行存储同一逻辑记录”的情况:首行含标识性前缀(如Superman/、Batman/),次行含对应名称(如Clark Kent、Bruce Wayne),而数值字段(如250lbs)位于中间列。此时需跨行合并特定列,而非简单拼接整行——关键约束是列数必须严格保持不变

Python的csv模块完全支持此类操作。核心思路是:利用csv.reader逐行迭代,当检测到触发行(如首列值为"Superman/")时,主动调用next(reader)读取下一行,并仅对目标列(如第0列和第2列)执行字符串拼接,其余列保持原样。skipinitialspace=True参数可自动去除各字段前导空格,避免因格式不洁导致匹配失败。

以下为推荐的内存高效流式处理方案(读写同步,无需缓存全部数据):

import csvwith (    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:        # 检测触发行:首列为"Superman/"(可根据实际需求调整条件)        if row and len(row) > 2 and row[0].strip() == "Superman/":            try:                next_row = next(reader)  # 跳至下一行                # 仅合并第0列和第2列,保持列数不变                row[0] += next_row[0].strip()                row[2] += next_row[2].strip()            except StopIteration:                raise ValueError("触发行后缺少配对行,请检查CSV格式")        writer.writerow(row)

注意事项与最佳实践:

  • 始终先写入新文件:示例中输出到output.csv,验证无误后再替换原文件,避免数据丢失;
  • 添加边界检查:row and len(row) > 2防止空行或列数不足导致索引错误;
  • 使用.strip()清理空格:确保next_row[0]等值无冗余空格影响拼接结果;
  • ⚠️ 注意迭代器状态:next(reader)会跳过当前循环的下一次自动迭代,因此无需额外continue;
  • ? 灵活适配条件:若触发模式多样(如多组/前缀),可将if判断升级为正则匹配或列表检查。

该方法不依赖第三方库,兼容任意规模CSV,且逻辑清晰可控——真正实现“精准列合并”,而非粗粒度的行拼接。

相关文章

精彩推荐