Python开发票务系统写入CSV报错 '_csv.writer' object is not iterable
票务系统问题修复
报错原因
'_csv.writer' object is not iterable 错误由代码末尾的 for row in writer: 触发:csv.writer 是CSV文件写入工具对象,本身不属于可迭代类型,不能用于for循环遍历。
其他逻辑问题
- 所有用户的字段分别存储在
name_l、age_l等列表中,但写入时错误使用了单次循环的临时变量,还直接传入完整列表作为字段值,输出内容完全不符合要求 - 缺少表头写入逻辑
- 未处理字段默认值:非马来西亚人没有OKU、IC号需补0和
-,马来西亚人没有护照号需补- - IC号/护照号校验逻辑错误:输入错误后重输时,错误值也会被追加到列表,导致列表长度和购票人数不匹配
修复后完整代码
import csv with open(input("\nInput file name with .csv extension: "), 'w+', newline='', encoding='utf-8') as f: people = int(input("\nHow many tickets: ")) name_l = [] age_l = [] sex_l = [] malaysian_l = [] oku_l = [] ic_number_l = [] passport_number_l = [] fee_l = [] for p in range(people): name = str(input("\nName: ")) name_l.append(name) malaysian = int(input("Malaysian (1 = Yes, 0 = No): ")) malaysian_l.append(str(malaysian)) age = int(input("Age: ")) age_l.append(str(age)) sex = str(input("Gender: ")) sex_l.append(sex) if malaysian == 1: oku = int(input("OKU (1 = Yes, 0 = No): ")) oku_l.append(str(oku)) if age >= 13 and age <= 59: fee = 17.80 if oku == 1: fee += 5 elif (age >= 4 and age <= 12) or age >= 60: fee = 7.10 if oku == 1: fee += 5 else: fee = 0.00 if oku == 1: fee += 5 fee_l.append(f"{fee:.2f}") print(fee) # 修正IC号校验逻辑,只有输入正确才加入列表 while True: ic_number = str(input("Input IC Number: ")) if len(ic_number) == 12: ic_number_l.append(ic_number) break print("IC Number must be 12 digits long. Try again!") # 马来西亚人护照号填- passport_number_l.append("-") else: # 非马来西亚人OKU填0,IC号填- oku_l.append("0") ic_number_l.append("-") if age >= 13: fee = 23.70 elif age >= 4 and age <= 12: fee = 17.80 else: fee = 0.00 fee_l.append(f"{fee:.2f}") print(fee) # 修正护照号校验逻辑 while True: passport_number = str(input("Input Passport Number: ")) if len(passport_number) == 8: passport_number_l.append(passport_number) break print("Passport Number must be 8 digits long. Try again!") writer = csv.writer(f, delimiter = '\t') # 写入表头 writer.writerow(["Name", "Age", "Sex", "Malaysian", "OKU", "IC-Number", "Passport-Number", "Fee"]) # 遍历所有用户写入每行数据 for i in range(people): writer.writerow([ name_l[i], age_l[i], sex_l[i], malaysian_l[i], oku_l[i], ic_number_l[i], passport_number_l[i], fee_l[i] ])
内容的提问来源于stack exchange,提问作者Prophet4050
相关产品推荐
相关产品推荐

