CSV跨文件匹配填充报错:Python代码出现KeyError: 'h01'
问题排查:KeyError: 'h01'
错误原因
你在遍历search.csv的循环里犯了变量覆盖的问题:
原本SKU和COSTS_PRODUCTION是用来存字段名('sku'、'costs_production')的变量,结果你在循环里执行了SKU, COSTS_PRODUCTION = row[SKU], row[COSTS_PRODUCTION],把这两个变量的值改成了当前行的sku值(比如'h01')和成本数值。
后续执行input_[SKU]时,SKU已经变成了'h01',但input_这个字典的键是字段名'sku',自然找不到'h01'这个键,直接抛出KeyError。
修复方案
把循环里的变量名改成和全局字段名变量不冲突的名字,确保始终用原始字段名去访问字典:
import csv ID, SKU, COSTS_PRODUCTION = 'id', 'sku', 'costs_production' # 定义字段名常量 # 读取input.csv到列表 with open('input.csv', 'r', newline='') as inp: reader = csv.DictReader(inp) inputs = list(reader) # 匹配并更新成本数据 with open('search.csv', 'r', newline='') as sea: sea_reader = csv.DictReader(sea) for row in sea_reader: # 用新变量存储当前行的sku和成本,避免覆盖字段名常量 current_sku = row[SKU] current_cost = row[COSTS_PRODUCTION] for input_ in inputs: if input_[SKU] == current_sku: input_[COSTS_PRODUCTION] = current_cost break # 写入更新后的文件 with open('input_updated.csv', 'w', newline='') as outp: fieldnames = inputs[0].keys() writer = csv.DictWriter(outp, fieldnames) writer.writeheader() writer.writerows(inputs) print('done')
额外优化建议
当前代码的时间复杂度是O(M*N)(M是search.csv行数,N是input.csv行数),如果数据量很大,效率会很低。可以把search.csv的数据先转成字典,用sku做键,成本做值,这样匹配时直接O(1)查找:
import csv ID, SKU, COSTS_PRODUCTION = 'id', 'sku', 'costs_production' # 读取input.csv with open('input.csv', 'r', newline='') as inp: reader = csv.DictReader(inp) inputs = list(reader) # 将search.csv转为sku:成本的映射字典 sku_cost_map = {} with open('search.csv', 'r', newline='') as sea: sea_reader = csv.DictReader(sea) for row in sea_reader: sku_cost_map[row[SKU]] = row[COSTS_PRODUCTION] # 批量更新input数据 for input_ in inputs: sku = input_[SKU] if sku in sku_cost_map: input_[COSTS_PRODUCTION] = sku_cost_map[sku] # 写入结果文件 with open('input_updated.csv', 'w', newline='') as outp: fieldnames = inputs[0].keys() writer = csv.DictWriter(outp, fieldnames) writer.writeheader() writer.writerows(inputs) print('done')
内容的提问来源于stack exchange,提问作者Bill Bronson
相关产品推荐
相关产品推荐

