You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 12:09:52