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

Python数据持久化问题:如何通过文件更新列表及排查读取失效

问题分析与解决方案

原代码核心问题

  • 程序启动未加载历史数据,每次运行重置为初始列表,无法实现持久化
  • 用open("savedata.txt", "w")打开文件会清空原有内容,且未正确关闭文件
  • 直接将列表转为字符串写入,读取时无法便捷还原为列表结构
  • 密码验证仅做输入,未实现校验逻辑
  • 读取测试代码的文件名与保存文件名不一致(savelist.txt vs savedata.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 15:27:49