如何用csv.writer向已有CSV文件添加新行并同步字典列表
实现CsvReader的add_item方法方案
首先明确add_item需要完成三个核心动作:收集用户输入并格式化、更新内存中的字典列表self.result、追加写入CSV文件。以下是具体实现步骤和代码:
核心步骤拆解
- 收集用户输入:逐个获取商品编号、名称、价格、数量,注意将价格和数量转换为数值类型(避免存成字符串)
- 构造与现有条目格式一致的字典:键名要和CSV表头以及
self.result中的字典键完全匹配 - 更新内存数据:把新字典追加到
self.result,确保show_available能直接读取到新增项 - 写入CSV文件:用
csv.DictWriter以追加模式打开文件,写入新条目(不用手动写逗号分隔,避免格式错误)
完整代码实现
假设你的CSV表头是id,price,quantity,name(可根据实际表头调整键名),CsvReader类的完整实现如下:
import csv class CsvReader: def __init__(self, csv_file): self.csv_file = csv_file self.result = [] self.make_dict_items() # 初始化时加载已有数据到self.result def make_dict_items(self): # 读取CSV并转为字典列表存入self.result with open(self.csv_file, 'r', newline='', encoding='utf-8') as f: reader = csv.DictReader(f) self.result = list(reader) # 把price和quantity转成数值类型,避免后续操作问题 for item in self.result: item['price'] = float(item['price']) item['quantity'] = int(item['quantity']) def show_available(self): # 遍历self.result打印所有条目 for idx, item in enumerate(self.result, 1): print(f"条目{idx}: 编号{item['id']}, 名称{item['name']}, 价格{item['price']}, 数量{item['quantity']}") def add_item(self): # 1. 获取用户输入并处理格式 item_id = input("请输入商品编号: ").strip() name = input("请输入商品名称: ").strip() # 循环校验价格输入格式 while True: try: price = float(input("请输入商品价格: ").strip()) break except ValueError: print("请输入有效的数字格式价格") # 循环校验数量输入格式 while True: try: quantity = int(input("请输入商品数量: ").strip()) break except ValueError: print("请输入有效的整数数量") # 2. 构造符合格式的字典 new_item = { 'id': item_id, 'price': price, 'quantity': quantity, 'name': name } # 3. 更新内存中的字典列表 self.result.append(new_item) # 4. 追加写入CSV文件 with open(self.csv_file, 'a', newline='', encoding='utf-8') as f: writer = csv.DictWriter(f, fieldnames=new_item.keys()) # 若需兼容空文件初始化,可取消下方注释(用户已有CSV文件可忽略) # if os.path.getsize(self.csv_file) == 0: # writer.writeheader() writer.writerow(new_item) print("商品已成功添加")
关键注意点
- 键名匹配:
new_item的键必须和CSV表头完全一致,否则DictWriter会写入失败或列错位 - 数据类型转换:必须把价格、数量转成数值类型,避免后续统计、查询时出现字符串运算问题
- 文件打开模式:用
'a'模式追加写入,不会覆盖原有内容;newline=''是csv模块推荐写法,避免跨平台换行符问题 - 内存同步:一定要把
new_item追加到self.result,这样show_available调用时才能直接显示新增条目
内容的提问来源于stack exchange,提问作者py_coder1019
相关产品推荐
相关产品推荐

