如何基于公共ID将字典数据写入CSV并修正列值重复问题
解决CSV合并时Pet列值全部重复的问题
核心原因分析
Pet列所有条目值相同,基本逃不出两种情况:
- 字典的键与CSV2中ID列的数据类型不匹配(比如字典键是整数,CSV2读取的ID是字符串),导致取值时始终拿到默认值或固定值
- 赋值逻辑错误,在循环外部提前固定了Pet值,循环内没有根据每行ID动态取值
针对性解决方案
1. 统一键与ID的数据类型
假设你的映射字典是:
pet_map = {1: "Cat", 2: "Dog", 3: "Bird"}
如果CSV2的ID列读取后是字符串类型(如"1"、"2"),直接用row['ID']查字典会匹配失败。此时需要在循环内把ID转换成和字典键一致的类型:
import csv # 从CSV1提取的映射字典 pet_map = {1: "Cat", 2: "Dog", 3: "Bird"} # 处理CSV2并生成输出文件 with open("csv2.csv", "r", newline="") as in_file, open("output.csv", "w", newline="") as out_file: reader = csv.DictReader(in_file) # 新增Pet字段 field_names = reader.fieldnames + ["Pet"] writer = csv.DictWriter(out_file, fieldnames=field_names) writer.writeheader() for row in reader: # 将CSV2的ID转换为整数,与字典键类型匹配 current_id = int(row["ID"]) # 根据ID取值,找不到则设为Unknown(可根据需求调整) row["Pet"] = pet_map.get(current_id, "Unknown") writer.writerow(row)
2. 修正错误的赋值逻辑
如果你的代码是类似下面这种错误写法(循环外固定值),必须调整为循环内动态取值:
# ❌ 错误示例:循环外赋值导致所有行Pet值相同 fixed_pet = pet_map[1] for row in reader: row["Pet"] = fixed_pet writer.writerow(row)
# ✅ 正确写法:循环内根据每行ID动态取值 for row in reader: current_id = int(row["ID"]) row["Pet"] = pet_map.get(current_id, "Unknown") writer.writerow(row)
快速验证方法
可以先打印字典键和CSV2 ID的类型,确认是否匹配:
# 打印字典键的类型 print(type(next(iter(pet_map.keys())))) # 打印CSV2第一行ID的类型 with open("csv2.csv", "r") as f: reader = csv.DictReader(f) first_row = next(reader) print(type(first_row["ID"]))
内容的提问来源于stack exchange,提问作者chitete
相关产品推荐
相关产品推荐

