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

Python CSV右连接脚本异常:新增列名及值变为0.1求助

问题分析与修复方案

问题根源

你的脚本存在两个核心问题导致新增列异常:

  1. 未区分表头与数据行:脚本将CSV的表头行和数据行混在一起处理,导致表头行也被追加了"0"或"1",而非单独添加"present"列名。
  2. 行比较效率低下:使用列表的in操作判断行存在性,时间复杂度为O(n),大文件下会显著变慢。

另外,代码里的elif条件row2 in rows_csv2 and row2 in rows_csv1完全冗余——因为循环本身就是遍历rows_csv2的元素,row2必然在rows_csv2中。

修复后的脚本

import csv

def compare_csv(csv1, csv2, output_file):
    # 读取csv1:分离表头和数据行,数据行转成tuple方便哈希查找
    with open(csv1, 'r') as file1:
        csv_reader1 = csv.reader(file1)
        header1 = next(csv_reader1)
        rows_csv1 = set(tuple(row) for row in csv_reader1)

    # 读取csv2:分离表头和数据行
    with open(csv2, 'r') as file2:
        csv_reader2 = csv.reader(file2)
        header2 = next(csv_reader2)
        rows_csv2 = [row for row in csv_reader2]

    # 准备结果表头:添加"present"列
    result_header = header2 + ["present"]
    result_rows = [result_header]

    # 处理csv2的每一行数据
    for row2 in rows_csv2:
        row_tuple = tuple(row2)
        if row_tuple not in rows_csv1:
            result_rows.append(row2 + ["1"])
        else:
            result_rows.append(row2 + ["0"])

    # 写入结果文件
    with open(output_file, 'w', newline='') as result_file:
        csv_writer = csv.writer(result_file)
        csv_writer.writerows(result_rows)

if __name__ == "__main__":
    csv1 = input("输入旧CSV文件路径: ")
    csv2 = input("输入新CSV文件路径: ")
    output_file = "result.csv"

    compare_csv(csv1, csv2, output_file)
    print("操作完成,已生成result.csv文件。")

关键修复点说明

  • 表头单独处理:通过next()函数单独提取CSV的表头行,给表头追加"present"列名后作为结果的第一行。
  • 数据行转集合:将csv1的数据行转成tuple存入集合,这样判断行存在性的时间复杂度降为O(1),大幅提升效率。
  • 简化逻辑:移除冗余的elif条件,直接用else处理共有的行。

内容的提问来源于stack exchange,提问作者Armando_pagano

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 20:34:53