使用Python开发CSV票务系统时读取CSV文件功能异常如何解决
问题修复方案
存在的问题
- 读取csv时未指定分隔符:写入时用制表符
\t作为分隔符,读取时csv.reader默认使用逗号分隔,导致整行被识别为单个字段 - 写入逻辑错误:循环收集了所有乘客的姓名、年龄、性别列表后,仅写入了最后一次输入的单条数据,循环逻辑完全失效
- 输出格式错误:直接打印
csv.reader返回的列表对象,没有转换为空格分隔的普通字符串 - 文件打开缺少
newline=''参数:Windows系统下会自动生成多余空行,导致读取结果中出现空列表
修复后完整代码
import sys, select, os, csv from os import system def option_1(): with open(input("\nInput file name with .csv extension: "), 'w+', newline='') as f: people = int(input("\nHow many tickets: ")) name_l = [] age_l = [] sex_l = [] for p in range(people): name = str(input("\nName: ")) name_l.append(name) age = str(input("\nAge: ")) age_l.append(age) sex = str(input("\nGender: ")) sex_l.append(sex) field_names = ['Name', 'Age', 'Gender'] writer = csv.DictWriter(f, fieldnames = field_names, delimiter = '\t') writer.writeheader() writer = csv.writer(f, delimiter = '\t') # 修复循环逻辑,写入所有收集到的乘客信息 for i in range(people): writer.writerow([name_l[i], age_l[i], sex_l[i]]) def option_2(): with open(input('Input file name with .csv extension: '), 'a+', newline='') as f: people = int(input("\nHow many tickets: ")) name_l = [] age_l = [] sex_l = [] for p in range(people): name = str(input("\nName: ")) name_l.append(name) age = str(input("\nAge: ")) age_l.append(age) sex = str(input("\nGender: ")) sex_l.append(sex) writer = csv.writer(f, delimiter = '\t') # 修复循环逻辑,写入所有新增的乘客信息 for i in range(people): writer.writerow([name_l[i], age_l[i], sex_l[i]]) def option_3(): with open(input("\nInput file name with .csv extension: "), 'r', newline='') as f: # 读取时指定分隔符为制表符 f_reader = csv.reader(f, delimiter='\t') for row in f_reader: if row: # 跳过空行 # 转换为空格分隔的字符串打印 print(' '.join(row)) def main(): system('cls') print("\nTicket Booking System\n") print("\n1. Ticket Reservation") print("\n2. Append to an existing file") print("\n3. Read from an existing file") print("\n0. Exit Menu") print('\n') while True: option = int(input("Choose an option: ")) if option < 0 or option > 3: print("Please choose a number according to the menu!") else: while True: if option == 1: system('cls') option_1() user_input=input("\nPress ENTER to return to main menu: \n") if((not user_input) or (int(user_input)<=0)): main() elif option == 2: system('cls') option_2() user_input=input("\nPress ENTER to return to main menu: \n") if((not user_input) or (int(user_input)<=0)): main() elif option == 3: system('cls') option_3() user_input=input("\nPress ENTER to return to main menu: \n") if((not user_input) or (int(user_input)<=0)): main() else: exit() if __name__ == "__main__": main()
内容的提问来源于stack exchange,提问作者Prophet4050
相关产品推荐
相关产品推荐

