如何用Python或Bash对比两CSV文件特定列并输出指定格式差异行
解决CSV合并问题:填充独有行的缺失值
我来帮你搞定这个CSV合并的需求!之前用itertools没处理好独有行的“-”填充,主要是因为没有很好地处理两个文件的键映射关系。用字典来存储每行的对应关系会更直观,能完美解决这个问题。
解决方案思路
- 读取CSV并构建映射字典:把每个CSV的第一列作为键,第二列作为值存入字典,这样可以快速查找任意行对应的第二列值。
- 获取所有行的集合:取两个字典键的并集,这样就能包含所有共有行和各自独有的行。
- 生成输出内容:遍历所有行键,从两个字典中取值,不存在的键就用“-”填充,最后写入新的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
相关产品推荐
相关产品推荐

