Python读取input.csv匹配reference.csv填充Group列至output.csv问题
问题排查:CSV文件根据Type匹配填充Group列失败
两个CSV文件说明
input.csv(动态更新的工作文件)
| Name | Type | Owner | Status | Date | Group |
|---|---|---|---|---|---|
| bananas | fruit | Joe | In Stock | 1/1/23 | |
| apples | fruit | jim | Out Of Stock | 1/2/23 | |
| tomato | veggie | bob | In Stock | 1/3/23 | |
| potato | vegie | tom | Out Of Stock | 1/4/23 | |
| kiwi | fruit | jane | In Stock | 1/5/23 | |
| chicken | meat | francis | Out Of Stock | 1/6/23 | |
| beef | meat | linda | In Stock | 1/7/23 |
reference.csv(静态参考文件)
| Type | Group |
|---|---|
| fruit | 1 |
| veggie | 2 |
| meat | 3 |
问题现象
编写的Python代码仅将input.csv内容复制到output.csv,未完成Group列的填充,推测问题出在if语句或writer.writerow的调用位置。
原代码
with open("input.csv", "r") as csv_input, open("reference.csv", "r")as assign_csv, open("output.csv", "w") as out_file: reader = csv.reader(csv_input) reader2 = csv.reader(assign_csv) writer = csv.writer(out_file) for error in reader: writer.writerow(error) for group in reader2: if group[0] in error[1]: error[5] = group[1] writer.writerow(error)
问题原因
- reader对象只能遍历一次:reference.csv对应的
reader2在第一次遍历后就会耗尽,后续input行无法再读取参考数据 - 提前写入未填充行:在匹配Group值之前就把原始行写入了output.csv,导致最终文件既有未填充的原始行,又可能出现重复的填充行
- 匹配逻辑不准确:
group[0] in error[1]是包含匹配,应该用精确相等group[0] == error[1],避免误匹配(比如"fruitty"会被错误匹配到"fruit") - 未处理表头:代码没有跳过表头,会把表头行也参与匹配逻辑,导致错误
修正后的代码
import csv # 先加载reference.csv的Type-Group映射到字典,实现快速查找 type_group_map = {} with open("reference.csv", "r") as assign_csv: ref_reader = csv.reader(assign_csv) next(ref_reader) # 跳过参考文件的表头 for row in ref_reader: type_group_map[row[0]] = row[1] # 处理input.csv并生成填充后的output.csv with open("input.csv", "r") as csv_input, open("output.csv", "w", newline="") as out_file: input_reader = csv.reader(csv_input) output_writer = csv.writer(out_file) # 写入input文件的表头 header = next(input_reader) output_writer.writerow(header) for row in input_reader: item_type = row[1] # 从字典获取对应Group,无匹配则保留空值 row[5] = type_group_map.get(item_type, "") output_writer.writerow(row)
额外提示
- input.csv中potato的Type拼写为
vegie,与reference.csv中的veggie不一致,会导致该行无法匹配到Group值,需要手动修正拼写,或者在代码中添加容错处理(如忽略大小写、模糊匹配) - 使用字典存储映射关系,比嵌套循环的效率更高,尤其适合参考数据量较大的场景
内容的提问来源于stack exchange,提问作者Happy.Hartman
相关产品推荐
相关产品推荐

