You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python票务系统如何实现多组输入按指定格式存储到文件并读取

问题根源

  • 内容被覆盖:你使用w+模式打开文件,该模式会直接清空文件原有内容再写入,自然会覆盖旧记录
  • 写入格式异常:你写入时遍历的是单条字符串变量name/sex而非存储全部记录的列表name_l/sex_l,遍历字符串会逐个输出字符,再加上每个字符后都加了换行符,就出现了单字符占一行的问题;同时你没有按姓名;年龄;性别的格式拼接单条记录,而是分开写入姓名、年龄、性别三类数据

修复方案

核心修改点

  1. 将文件打开模式从w+改为a+,实现追加写入不覆盖旧内容
  2. 写入时按索引同步取三个列表的对应值,拼接为{name};{age};{sex}\n的格式后写入
  3. 修复票务信息打印逻辑,取列表内存储的全部记录而非最后一次录入的值
  4. 移除不必要的递归调用、无效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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 10:54:03