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

Python比对两个CSV输出差异的代码却打印相同内容,问题出在哪?

CSV比对异常问题排查与修复方案

核心问题原因

  • 行首尾隐形字符不匹配:你提供的示例行末尾存在多余空格,且不同系统的换行符(Windows为\r\n、Linux/macOS为\n)会导致读取出的行内容存在肉眼不可见的差异,Python的in运算符会严格匹配所有字符,因此会判定逻辑上相同的行内容不一致。
  • 遍历逻辑不符合预期:你最初的写法仅会输出csv2独有的行,修改后的写法仅会输出csv1独有的行,无法同时输出两个文件各自独有的内容。

修复后代码

基础版(小文件适用)

对每行内容先做清洗再比对,同时输出两个文件的独有行:

# 读取文件时清洗每行首尾的空白、换行符,过滤空行
with open('csv1.csv', 'r', encoding='utf-8') as t1, open('csv2.csv', 'r', encoding='utf-8') as t2: 
    fileone = [line.strip() for line in t1.readlines() if line.strip()]
    filetwo = [line.strip() for line in t2.readlines() if line.strip()]

with open('csv3.csv', 'w', encoding='utf-8') as outFile:
    # 写入csv2独有的行
    for line in filetwo:
        if line not in fileone:
            outFile.write(line + '\n')
    # 写入csv1独有的行,若仅需某一侧独有内容可删除本段
    for line in fileone:
        if line not in filetwo:
            outFile.write(line + '\n')

优化版(大文件适用)

用集合存储清洗后的行,比对效率更高:

with open('csv1.csv', 'r', encoding='utf-8') as t1, open('csv2.csv', 'r', encoding='utf-8') as t2: 
    set_one = set(line.strip() for line in t1.readlines() if line.strip())
    set_two = set(line.strip() for line in t2.readlines() if line.strip())

# 取两个集合的对称差,即仅在一个文件中存在的行
diff_lines = set_one.symmetric_difference(set_two)

with open('csv3.csv', 'w', encoding='utf-8') as outFile:
    for line in diff_lines:
        outFile.write(line + '\n')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 02:57:02