如何编辑CSV文件的指定值?Python匹配UUID扣减CSV轮胎数量
现有代码核心问题
- 文件打开模式错误:使用
a(追加)模式打开CSV时,文件指针默认在末尾,既读不到原有内容,也无法修改已有行,只能在文件最后加新内容 - 未实现核心业务逻辑:仅做了UUID匹配打印,没有实现「匹配指定TYRE SIZE、扣减对应QUANTITY」的功能
- 没有数据安全逻辑:直接读写原文件如果中途报错,会直接损坏原始CSV数据
- 缺少边界校验:没有判断库存是否足够,容易扣出负数库存
实现逻辑说明
- 用
csv.DictReader按表头读数据,不用硬编码列索引,后续CSV列顺序调整也不影响代码运行 - 读写分离:先把原文件内容逐行处理后写入临时文件,处理完成后再用临时文件替换原文件,避免损坏原始数据
- 扣减前做库存校验,库存不足时给出提示、不执行扣减
- 保留原有UUID生成、二维码导出逻辑,和库存扣减逻辑解耦
修正后可直接运行的代码
import uuid import pyqrcode import csv import os # 原有UUID、二维码生成逻辑 generate_uuid = str(uuid.uuid1()) print(f"生成的新UUID: {generate_uuid}") qr_code = pyqrcode.create(generate_uuid) qr_code.png(f'myqr{generate_uuid}.png', scale=6) # 配置业务参数 target_size = input("请输入要扣减库存的TYRE SIZE: ") deduct_num = int(input("请输入要扣减的库存数量: ")) temp_csv_path = 'temp_data.csv' # 读原文件、写临时文件 with open('data.csv', 'r', encoding='utf-8') as origin_file, \ open(temp_csv_path, 'w', encoding='utf-8', newline='') as temp_file: reader = csv.DictReader(origin_file) writer = csv.DictWriter(temp_file, fieldnames=reader.fieldnames) writer.writeheader() for row in reader: # 匹配目标轮胎尺寸 if row['TYRE SIZE'].strip() == target_size.strip(): current_stock = int(row['QUANTITY']) # 库存不足校验 if current_stock < deduct_num: print(f"扣减失败:{target_size}当前库存为{current_stock},不足扣减{deduct_num}") else: row['QUANTITY'] = str(current_stock - deduct_num) print(f"扣减成功:{target_size}剩余库存为{row['QUANTITY']}") writer.writerow(row) # 临时文件替换原文件,完成修改 os.replace(temp_csv_path, 'data.csv')
使用注意事项
- 运行代码前请关闭打开状态的
data.csv(尤其是用Excel打开时会锁文件,导致写入失败) - 如果你的CSV文件是GBK编码,把两处
open()里的encoding='utf-8'改成encoding='gbk'即可 - 如果需要切换匹配维度(比如按UUID匹配而非TYRE SIZE),只需要把判断条件里的
row['TYRE SIZE']换成row['UUID']即可 - 如果需要新增轮胎条目,在遍历完所有行之后用
writer.writerow()写入新的字典数据即可
内容的提问来源于stack exchange,提问作者aniketh shet
相关产品推荐
相关产品推荐

