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

如何用Python或Bash对比两CSV文件特定列并输出指定格式差异行

解决CSV合并问题:填充独有行的缺失值

我来帮你搞定这个CSV合并的需求!之前用itertools没处理好独有行的“-”填充,主要是因为没有很好地处理两个文件的键映射关系。用字典来存储每行的对应关系会更直观,能完美解决这个问题。

解决方案思路

  1. 读取CSV并构建映射字典:把每个CSV的第一列作为键,第二列作为值存入字典,这样可以快速查找任意行对应的第二列值。
  2. 获取所有行的集合:取两个字典键的并集,这样就能包含所有共有行和各自独有的行。
  3. 生成输出内容:遍历所有行键,从两个字典中取值,不存在的键就用“-”填充,最后写入新的CSV文件。

完整代码实现

import csv

def read_csv_to_dict(file_path):
    """读取CSV文件,返回{第一列值: 第二列值}的字典"""
    data_dict = {}
    with open(file_path, mode='r', newline='', encoding='utf-8') as file:
        reader = csv.reader(file)
        # 如果你的CSV没有表头,就注释掉下面这一行
        next(reader)
        for row in reader:
            # 确保每行至少有两列,避免索引越界错误
            if len(row) >= 2:
                data_dict[row[0]] = row[1]
    return data_dict

# 读取两个源文件的数据
file1_data = read_csv_to_dict('file1.csv')
file2_data = read_csv_to_dict('file2.csv')

# 获取所有唯一的行标识(两个文件的第一列值的并集)
all_rows = set(file1_data.keys()).union(set(file2_data.keys()))
# 可选:对行进行排序,让输出更整齐,不需要的话可以去掉sorted()
all_rows = sorted(all_rows)

# 写入输出CSV
with open('output.csv', mode='w', newline='', encoding='utf-8') as file:
    writer = csv.writer(file)
    # 写入表头,根据你的实际需求修改名称
    writer.writerow(['Row Identifier', 'File1 Value', 'File2 Value'])
    for row_id in all_rows:
        # 从字典取值,不存在则用'-'填充
        file1_val = file1_data.get(row_id, '-')
        file2_val = file2_data.get(row_id, '-')
        writer.writerow([row_id, file1_val, file2_val])

关键细节说明

  • 字典的get()方法:这是解决你问题的核心!dict.get(key, default)会在键不存在时返回你指定的默认值(这里就是“-”),完美处理了独有行的填充需求。
  • 处理表头:代码里默认你的CSV有表头,如果没有表头,只需要注释掉next(reader)这一行,同时调整输出的表头行(或者直接去掉表头行)。
  • 排序选项:用sorted()对所有行进行排序,让输出的CSV更整齐,如果你不需要排序,直接去掉这一行即可。

这个方法比用itertools更直白,也更容易维护,能确保所有行都被正确处理,独有行的缺失值也会被正确填充成“-”。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:23:26