本文介绍使用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)
注意事项与最佳实践:
该方法不依赖第三方库,兼容任意规模CSV,且逻辑清晰可控——真正实现“精准列合并”,而非粗粒度的行拼接。