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

如何基于SKU匹配实现跨CSV文件的列值更新?

如何基于SKU匹配实现跨CSV文件的列值更新?

看起来你已经迈出了第一步,成功读取了两个CSV文件,但在SKU匹配和库存更新的逻辑上有点卡壳了。我来帮你梳理下思路,把代码理顺~

先明确你的核心需求:

  • 从第一个CSV(read.csv)提取SKU(比如kh10这类标识)和对应的库存值
  • 遍历第二个CSV(import.csv),找到匹配的SKU,将它的库存列替换为第一个CSV里的对应值
  • 最终保存更新后的结果

先结合你的示例文件,明确下两个文件的列结构(注意Python索引从0开始):

第一个文件(read.csv,数据源):
,,kh10,,,,0
,,kh12,,,,21
,,kh13,,,,1
,,kh11,,,,45
,,kh20,,,,26
SKU在第3列(索引2),库存值在最后一列(索引7)

第二个文件(import.csv,待更新):
,kh20,,,0
,kh16,,,47
,kh12,,,31
,kh10,,,2
,kh13,,,0
SKU在第2列(索引1),库存值在最后一列(索引4)

优化后的代码及解释

import csv

# 第一步:把第一个CSV的SKU和对应库存做成字典,实现高效查找
sku_inventory_map = {}
with open("C:\\Users\\Owner\\OneDrive\\Desktop\\Test\\read.csv", 'r') as file:
    reader = csv.reader(file)
    for row in reader:
        # 跳过空行或不完整的行,避免索引报错
        if len(row) >= 8:
            sku = row[2]  # 对应第一个文件的SKU列索引
            inventory = row[7]  # 对应第一个文件的库存列索引
            sku_inventory_map[sku] = inventory

# 第二步:遍历第二个CSV,匹配SKU并更新库存
updated_rows = []
with open("C:\\Users\\Owner\\OneDrive\\Desktop\\Test\\import.csv", 'r') as file:
    reader = csv.reader(file)
    for row in reader:
        if len(row) >= 5:
            current_sku = row[1]  # 对应第二个文件的SKU列索引
            # 如果当前SKU在字典里存在,就替换库存值
            if current_sku in sku_inventory_map:
                row[4] = sku_inventory_map[current_sku]
            updated_rows.append(row)

# 第三步:将更新后的内容写入新文件(建议写新文件,避免覆盖原数据)
with open("C:\\Users\\Owner\\OneDrive\\Desktop\\Test\\updated_import.csv", 'w', newline='') as file:
    writer = csv.writer(file)
    writer.writerows(updated_rows)

print("更新完成!已保存为updated_import.csv")

关键改进点说明

  • 用字典存储SKU映射:比起你之前的嵌套循环,字典的查找效率是O(1),不仅更快,逻辑也更清晰
  • 明确列索引:你之前的代码里列索引设置有误,这里根据你的示例文件做了修正,如果实际文件列位置不同,记得调整对应的索引值
  • 增加容错判断:加入了行长度检查,避免CSV里有空行或不完整行时出现索引越界报错
  • 保留原文件安全:将更新后的内容写入新文件,不会覆盖原始的import.csv,更稳妥

备注:内容来源于stack exchange,提问作者nealgoogs

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 12:49:28