Python实现两个CSV文件匹配SKU并补充对应颜色数据问题
解决CSV文件按SKU补充颜色数据的问题
嘿,很高兴看到你在Python学习上的进步!咱们来一步步拆解你遇到的问题,找到更高效的解决方案~
你的代码核心问题:迭代器只能遍历一次
你最初的代码里,csv.reader返回的是迭代器对象——简单说就是,一旦你把它从头到尾遍历完一遍(比如第一个f1行的循环里,你把f2_reader的所有内容都读完了),后面再去循环它,就没有任何内容可以输出了。这就是为什么你的代码只处理了f1的第一行,后面的行根本没法再和f2的数据匹配。
你后来把打开f2的代码放到f1的循环里,每次处理一行f1就重新读一遍f2,确实能解决迭代器耗尽的问题,但这种方法效率很低——如果f1有几百上千行,就要重复打开读取几百次f2,完全没必要。
更优的解决方案:用字典预存颜色映射
我们可以先把File2.csv里的SKU和对应颜色存成一个字典,这样遍历File1.csv的时候,直接通过SKU查字典就能拿到颜色,不用反复读取File2。下面是完整的可运行代码:
import csv # 第一步:预加载File2的SKU-颜色映射到字典 color_map = {} with open('File2.csv', 'r', encoding='UTF-8') as f2: f2_reader = csv.reader(f2, delimiter=';') next(f2_reader) # 跳过表头行 for line in f2_reader: # 处理可能的空行或数据不完整的情况 if len(line) >= 2: sku = line[0].strip() # 去除SKU前后可能的空格 color = line[1].strip() color_map[sku] = color # 第二步:处理File1,补充颜色并生成输出文件 with open('File1.csv', 'r', encoding='UTF-8') as f1, open('output1.csv', 'w', newline='', encoding='UTF-8') as output_file: f1_reader = csv.reader(f1, delimiter=';') output_writer = csv.writer(output_file, delimiter=';') # 处理表头:添加color列 header = next(f1_reader) header.append('color') output_writer.writerow(header) # 遍历File1的每一行,补充颜色 for row in f1_reader: if len(row) >= 2: sku = row[0].strip() # 查找颜色,找不到就用空字符串 matched_color = color_map.get(sku, '') row.append(matched_color) output_writer.writerow(row)
代码说明
- 字典预存:只需要读取一次
File2,把SKU和颜色的对应关系存在字典里,后续查找颜色的速度极快(O(1)时间复杂度)。 - with语句:自动管理文件的打开和关闭,避免忘记关闭文件导致的资源泄漏。
- 异常防护:通过
len(line) >= 2判断,避免遇到空行或数据不全的行时抛出IndexError。 - 直接生成目标文件:不需要手动复制数据,代码直接生成你需要的
output1.csv,格式完全符合要求。
内容的提问来源于stack exchange,提问作者Wessel Jespers
相关产品推荐
相关产品推荐

