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

如何用Python对比两个CSV文件并生成自定义格式差异输出?

Python对比两个CSV文件并输出自定义差异格式

实现思路

  • 用csv.DictReader读取CSV文件,将每行数据转为字典,方便按字段名直接访问
  • 以Id作为唯一匹配键,把两个CSV的数据分别存入字典,实现通过Id快速定位对应行
  • 遍历第一个CSV的所有Id,对比第二个CSV中同Id行的每个字段值
  • 对字段值不同的情况,按照指定格式生成差异文本
  • 将所有差异文本写入输出文件

代码示例

import csv

def compare_csv(csv1_path, csv2_path, output_path):
    # 读取第一个CSV,构建Id到行数据的映射
    csv1_data = {}
    with open(csv1_path, 'r', encoding='utf-8') as f:
        reader = csv.DictReader(f)
        for row in reader:
            csv1_data[row['Id']] = row
    
    # 读取第二个CSV,构建同样的映射
    csv2_data = {}
    with open(csv2_path, 'r', encoding='utf-8') as f:
        reader = csv.DictReader(f)
        for row in reader:
            csv2_data[row['Id']] = row
    
    differences = []
    # 遍历第一个CSV的所有条目,对比第二个CSV的对应内容
    for id_val, row1 in csv1_data.items():
        if id_val not in csv2_data:
            differences.append(f"Id {id_val} does not exist in CSV 2")
            continue
        row2 = csv2_data[id_val]
        # 逐个字段对比(跳过Id字段)
        for field in row1.keys():
            if field == 'Id':
                continue
            val1, val2 = row1[field], row2[field]
            if val1 != val2:
                # 完全匹配示例格式的写法
                if field == 'Date':
                    differences.append(f"Id {id_val} {field} changed is to {val2}")
                else:
                    differences.append(f"Id {id_val} {field} is changed to {val2}")
    
    # 将差异写入输出文件
    with open(output_path, 'w', encoding='utf-8') as f:
        for line in differences:
            f.write(line + '\n')

# 调用示例
if __name__ == "__main__":
    compare_csv('csv1.csv', 'csv2.csv', 'differences.txt')

补充说明

  • 代码依赖Python标准库csv,无需额外安装第三方包
  • 假设两个CSV的字段名完全一致,且Id字段为唯一标识
  • 如果需要处理第二个CSV存在但第一个CSV缺失的Id,可以添加遍历csv2_data的逻辑补充对比

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 15:30:53