
本文介绍使用 python 的 csv 模块按条件合并相邻 csv 行(如将带斜杠的标题行与下一行对应字段拼接),同时严格保留原始列数,适用于结构化但分两行存储的混合数据场景。
本文介绍使用 python 的 csv 模块按条件合并相邻 csv 行(如将带斜杠的标题行与下一行对应字段拼接),同时严格保留原始列数,适用于结构化但分两行存储的混合数据场景。
在处理某些非标准 CSV 数据时(例如导出工具将长文本拆分为“标识符行 + 内容行”),常遇到类似以下结构:
Superman/, 250lbs, Batman/, 180lbs Clark Kent, , Bruce Wayne,
目标是将第二行对应位置的非空值(如 Clark Kent、Bruce Wayne)拼接到第一行相同列的末尾,得到:
Superman/Clark Kent,250lbs,Batman/Bruce Wayne,180lbs
关键要求是:列数不变(仍为 4 列),且仅对特定模式的行(如首列为 "Superman/")触发合并逻辑。
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 row and row[0].endswith('/'):
try:
next_row = next(reader) # 手动推进读取器,获取下一行
# 仅拼接第0列和第2列(按需扩展:如 row[i] += next_row[i] for i in [0, 2])
row[0] = row[0] + (next_row[0].strip() if len(next_row) > 0 else '')
if len(row) > 2 and len(next_row) > 2:
row[2] = row[2] + (next_row[2].strip() if next_row[2] else '')
except StopIteration:
pass # 若无下一行,跳过合并(避免异常)
writer.writerow(row)⚠️ 注意事项:
- next(reader) 会真实移动文件指针,因此该逻辑仅适用于顺序处理且合并规则明确的相邻行;
- 建议始终先写入 output.csv,人工校验无误后再替换原文件;
- skipinitialspace=True 可自动清理 ", 250lbs" 中的多余空格,避免拼接后出现 "Superman/ Clark Kent" 类错误;
- 若合并逻辑更复杂(如多组匹配、动态列索引),建议先用 list(csv.reader(...)) 加载全量数据再处理,便于调试。
? 扩展建议
- 通用化匹配:将硬编码 "Superman/" 替换为正则 re.match(r'.+/$', row[0]),适配任意以 / 结尾的标识行;
- 空值鲁棒性:拼接前检查 next_row[i] 是否存在且非空,避免 IndexError 或无效拼接(如 "" + "");
- 列对齐保障:合并前可用 len(row) == len(next_row) 校验列数一致性,确保结构稳定。
此方法不依赖 Pandas,轻量可靠,精准满足“合并指定行 + 列数恒定”的核心需求。

















