You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:23:41