如何用csv模块合并两个CSV列并过滤空行
解决CSV行合并与空行过滤的问题(Python csv模块实现)
我看你用csv模块处理两个CSV合并时遇到了乱序、列被合并成字符串、空行残留的问题,而且需求是只保留csv2对应行非空的csv1行,把csv2的字段追加到对应行后面。咱们来一步步修复这些问题:
原代码的问题分析
你的现有代码有几个关键问题导致了异常结果:
- 直接用
f1.readline()读取csv2的行,这会把整行(包括换行符)当作单个字符串塞到row[6],而不是解析成CSV的字段列表,所以会出现列合并成一个字符串的情况 - 没有检查csv2的行是否为空,导致csv2空行对应的csv1行被错误保留
- 没有用
csv.reader解析csv2文件,而是直接读取原始文件行,同时遍历方式没有保证两个文件行的严格对应,容易出现乱序或行不匹配
修正后的代码
这是符合你需求的完整代码:
import csv # 同时打开三个文件,with语句自动处理关闭,避免资源泄漏 with open("1.csv", "r", encoding='utf-8') as csv1_file, \ open("2.csv", "r", encoding='utf-8') as csv2_file, \ open("3.csv", "w", encoding='utf-8', newline='') as output_file: # 用csv.reader解析两个输入文件,得到字段列表 reader1 = csv.reader(csv1_file) reader2 = csv.reader(csv2_file) writer = csv.writer(output_file) # 同时遍历两个reader的行,确保每行严格对应 for row1, row2 in zip(reader1, reader2): # 检查csv2的行是否为空(过滤全空白的单元格) # any()判断是否有非空白的单元格,没有则跳过 if not any(cell.strip() for cell in row2): continue # 合并两个行的字段列表,直接拼接即可 merged_row = row1 + row2 writer.writerow(merged_row)
代码说明
- 文件处理:用
with语句同时打开所有文件,自动处理文件关闭,避免手动close()可能带来的错误 - 行对应:用
zip(reader1, reader2)同时遍历两个CSV的行,保证csv1和csv2的行严格一一对应,解决乱序问题 - 空行过滤:
any(cell.strip() for cell in row2)会检查csv2的行是否有非空白的单元格,如果全是空或空白,就跳过该行,不写入csv1对应的行 - 正确合并字段:
row1 + row2直接拼接两个字段列表,这样每个字段都是独立的,不会变成单个字符串,符合CSV格式要求 - 避免末尾空行:打开输出文件时指定
newline='',这是csv模块官方推荐的写法,能避免Windows系统下出现多余的空行
测试结果
用你给出的示例数据测试,这个代码会生成你期望的csv3:
Row 1: Frog,Rat,Duck,Chicken,Pig
Row 2: Moose,Fox,Zebra,Bear,Boar
内容的提问来源于stack exchange,提问作者CodeOrDie
相关产品推荐
相关产品推荐

