Python票务系统如何实现多组输入按指定格式存储到文件并读取
问题根源
- 内容被覆盖:你使用
w+模式打开文件,该模式会直接清空文件原有内容再写入,自然会覆盖旧记录 - 写入格式异常:你写入时遍历的是单条字符串变量
name/sex而非存储全部记录的列表name_l/sex_l,遍历字符串会逐个输出字符,再加上每个字符后都加了换行符,就出现了单字符占一行的问题;同时你没有按姓名;年龄;性别的格式拼接单条记录,而是分开写入姓名、年龄、性别三类数据
修复方案
核心修改点
- 将文件打开模式从
w+改为a+,实现追加写入不覆盖旧内容 - 写入时按索引同步取三个列表的对应值,拼接为
{name};{age};{sex}\n的格式后写入 - 修复票务信息打印逻辑,取列表内存储的全部记录而非最后一次录入的值
- 移除不必要的递归调用、无效flush操作避免异常
修正后完整代码
import os from os import system def option_1(): file_name = input("Input file name with extension: ") # 改用a+模式,文件不存在创建,存在则追加内容不覆盖 with open(file_name, 'a+', encoding='utf-8') as f: people = int(input("\nHow many tickets: ")) name_l = [] age_l = [] sex_l = [] for p in range(people): name = input("\nName: ") name_l.append(name) age = int(input("\nAge: ")) age_l.append(age) sex = input("\nGender: ") sex_l.append(sex) # 按格式拼接每条记录后写入 for i in range(people): line = f"{name_l[i]};{age_l[i]};{sex_l[i]}\n" f.write(line) print("\nTotal Ticket: ", people, '\n') for p in range(people): print("Ticket No: ", p+1) print("Name: ", name_l[p]) print("Age: ", age_l[p]) print("Sex: ", sex_l[p]) def option_2(): file_name = input('Input file name with extension: ') if not os.path.exists(file_name): print("文件不存在,请先录入票务信息") return with open(file_name, 'r', encoding='utf-8') as f: f_contents = f.read() print("\n已存储的票务信息:") print(f_contents, end = '') def main(): while True: system('cls') print("\nTicket Booking System\n") print("1. Ticket Reservation") print("2. Read") print("0. Exit Menu") print('\n') option = int(input("Choose an option: ")) if option < 0 or option > 2: print("Please choose a number according to the menu!") input("按回车继续") continue if option == 1: system('cls') option_1() input("Press ENTER to return to main menu: \n") elif option == 2: system('cls') option_2() input("Press ENTER to return to main menu: \n") else: exit() if __name__ == "__main__": main()
额外优化说明
- 增加了文件存在性校验,读取不存在的文件时会给出提示不会直接报错
- 移除了main函数内的递归调用,改用循环逻辑避免多次操作后栈溢出
- 统一指定了文件编码为utf-8,避免不同系统下读写乱码
- input本身返回字符串,不需要额外用str()转换
内容的提问来源于stack exchange,提问作者Prophet4050
相关产品推荐
相关产品推荐

