解决TypeError: '_csv.writer' object is not an iterator错误,实现CSV行添加
解决TypeError: '_csv.writer' object is not an iterator错误(向CSV添加数据行)
你的错误根源很明确:在add_item方法里,你错误地把csv.writer实例赋值给了reader变量,接着用next()去读取它——但csv.writer是用来写文件的,根本不是迭代器,自然会报错。
下面是修改后的代码,重点修正了add_item方法的问题:
import csv class CsvReader: def __init__(self): self.result = [] def make_dict_items(self): # fn = os.path.join('subdir', "Items2.csv") with open("Items2.csv") as fp: reader = csv.reader(fp) labels = next(reader, None) for row in reader: row[0] = int(row[0]) row[1] = float(row[1]) row[2] = int(row[2]) self.result.append(dict(zip(labels, row))) def add_item(self): item_num = int(input("What is the items #?\n")) price = float(input("What is the items price?\n")) quant = int(input("What is the items quantity?\n")) name = input("What is the items name?\n") new_row = [item_num, price, quant, name] with open("Items2.csv", "a+", newline='') as fp: # 修正:创建csv.reader来读取表头,而非writer fp.seek(0) reader = csv.reader(fp) labels = next(reader, None) # 处理文件为空的情况:先写入表头 if not labels: labels = ["Item #", "Price", "Quantity", "Name"] # 替换成你CSV实际的表头 writer = csv.writer(fp) writer.writerow(labels) # 写入新数据行 writer = csv.writer(fp) writer.writerow(new_row) # 更新内存中的result列表 new_record = dict(zip(labels, new_row)) self.result.append(new_record)
关键修改说明:
- 把
reader = csv.writer(fp)改为reader = csv.reader(fp),用正确的读取类来获取表头。 - 打开文件时添加
newline='',避免CSV写入时出现多余空行(Python csv模块的最佳实践)。 - 增加了文件为空时的表头写入逻辑,避免首次运行报错。
- 直接用
writer.writerow(new_row)写入数据,无需转字典再取values——因为你输入的顺序已经和表头对应,更简洁高效。
内容的提问来源于stack exchange,提问作者py_coder1019
相关产品推荐
相关产品推荐

