Python CSV右连接脚本异常:新增列名及值变为0.1求助
问题分析与修复方案
问题根源
你的脚本存在两个核心问题导致新增列异常:
- 未区分表头与数据行:脚本将CSV的表头行和数据行混在一起处理,导致表头行也被追加了
"0"或"1",而非单独添加"present"列名。 - 行比较效率低下:使用列表的
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
相关产品推荐
相关产品推荐

