Python数据持久化问题:如何通过文件更新列表及排查读取失效
问题分析与解决方案
原代码核心问题
- 程序启动未加载历史数据,每次运行重置为初始列表,无法实现持久化
- 用
open("savedata.txt", "w")打开文件会清空原有内容,且未正确关闭文件 - 直接将列表转为字符串写入,读取时无法便捷还原为列表结构
- 密码验证仅做输入,未实现校验逻辑
- 读取测试代码的文件名与保存文件名不一致(
savelist.txtvssavedata.txt)
修正方案(用JSON实现数据持久化)
JSON可直接实现列表、字典等结构的序列化/反序列化,保存为可读文本,读取后能直接还原原数据类型,是实现数据持久化的便捷方式。
完整修正代码
import json # 定义数据存储文件路径 DATA_FILE = "library_data.json" # 加载历史数据:文件存在则读取,不存在则返回初始数据 def load_data(): try: with open(DATA_FILE, "r") as f: data = json.load(f) return data["library_list"], data["user_list"] except (FileNotFoundError, json.JSONDecodeError): # 文件不存在或解析失败时返回初始图书列表和空借阅列表 return ["Lord of the Flies", "Cat in the Hat", "Green Eggs and Ham", "One Fish Two Fish"], [] # 保存当前数据到文件 def save_data(library_list, user_list): data = { "library_list": library_list, "user_list": user_list } with open(DATA_FILE, "w") as f: json.dump(data, f, indent=4) # indent参数让文件内容格式化,便于查看 # 用户名密码验证逻辑 def authenticate(): correct_username = "school" correct_password = "password" username = input("What is your username \n") password = input("\nWhat is your password? ") return username == correct_username and password == correct_password # 主程序逻辑 def main(): # 先完成身份验证 if not authenticate(): print("Invalid username or password. Exiting.") return # 加载历史数据 library_list, user_list = load_data() checkout = False while not checkout: option = input(f"Welcome to the library. What book would you like to borrow? Available: {library_list}\n") option = option.strip() # 去除输入前后空格,避免因空格导致匹配失败 if option in library_list: library_list.remove(option) user_list.append(option) print(f"Library catalogue: {library_list}\nBorrowed books: {user_list}") save_data(library_list, user_list) # 每次修改后立即保存数据 order_confirm = input("Would you like to borrow another book? (y/n)\n") if order_confirm.lower() == "n": print("Thanks for coming!") checkout = True else: print("Okay, here is our catalogue.") elif option in user_list: print("I'm sorry, this item is currently borrowed by someone else. Please try again later.") else: print("This item is not in the library. Try again.") if __name__ == "__main__": main()
关键改进说明
- 数据持久化:通过
json.load()和json.dump()实现列表的序列化与反序列化,确保关闭程序后数据留存,下次启动自动加载 - 文件安全:使用
with语句管理文件,无需手动关闭,避免资源泄漏 - 身份验证:完善用户名密码校验,只有验证通过才能进入系统
- 输入优化:添加
strip()处理输入,避免用户输入带空格的书名导致匹配失败 - 可读性提升:用f-string替代字符串拼接,代码更简洁;保存JSON时格式化输出,便于人工查看
测试读取数据的正确代码
如果需要单独验证数据读取功能,可使用以下代码:
import json DATA_FILE = "library_data.json" try: with open(DATA_FILE, "r") as f: data = json.load(f) print("Library list:", data["library_list"]) print("User list:", data["user_list"]) except FileNotFoundError: print("Data file does not exist yet.") except json.JSONDecodeError: print("Data file is corrupted.")
内容的提问来源于stack exchange,提问作者Jayden Zheng
相关产品推荐
相关产品推荐

