Python如何读取两个CSV合并去重后写入单个文件并对齐字段
问题原因
你的现有代码是将第一个CSV的所有国家数据、第二个CSV的所有面积数据作为独立条目先后追加到同一个列表中,两类数据没有做关联匹配,自然会出现前半部分行缺少Area字段、后半部分行缺少其他字段的错位问题。你需要通过公共字段ISO3做关联,将Area字段补充到对应国家的已有数据条目里。
调整后完整代码
import csv language_file = '/file/path/shortlist_languages.csv' area_file = '/file/path/shortlist_area.csv' fp_write = input("Enter fp for writing new CSV (do not include .csv extension): ") # 用字典存储语言数据,key为ISO3,方便快速匹配 country_map = {} # 读取语言CSV with open(language_file, encoding='utf-8') as f: reader = csv.DictReader(f) for row in reader: iso3 = row['ISO3'] country_map[iso3] = { 'ISO3': iso3, 'Languages': row['Languages'], 'Country Name': row['Country Name'] } # 读取面积CSV,匹配对应国家补充Area字段 with open(area_file, encoding='utf-8') as f: reader = csv.DictReader(f) for row in reader: iso3 = row['ISO3'] # 仅处理两个表共有的ISO3条目,如果需要保留仅在面积表存在的条目可额外扩展逻辑 if iso3 in country_map: country_map[iso3]['Area'] = row['Area'] # 写入新CSV,按要求的表头顺序输出 output_path = f"{fp_write}country_data_table.csv" fieldnames = ['ISO3', 'Area', 'Languages', 'Country Name'] with open(output_path, 'w', encoding='utf-8', newline='') as f: writer = csv.DictWriter(f, fieldnames=fieldnames) writer.writeheader() for country_data in country_map.values(): writer.writerow(country_data)
核心修改点
- 读取第一个CSV时改用
ISO3为键的字典存储数据,无需遍历即可快速匹配对应国家条目 - 读取第二个CSV时直接给匹配到的国家条目新增
Area字段,不再追加独立的新条目 - 调整输出表头顺序为你要求的
['ISO3', 'Area', 'Languages', 'Country Name'],符合预期输出规范 - 新增
encoding='utf-8'参数避免不同系统下的特殊字符乱码问题,如果你的文件是其他编码可自行调整
内容的提问来源于stack exchange,提问作者Canuckster
相关产品推荐
相关产品推荐

