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

游戏保存时程序意外关闭?Python文件操作问题求助

问题分析与解决方案

核心问题

直接修改正在运行的Python模块文件(Save.py)是程序崩溃的根本原因:

  • 用w+模式打开Save.py写入时会清空原文件所有内容,而你的程序正引用该模块里的inv等变量,这会彻底打乱模块的内部状态。
  • 后续调用choose_poi()时,依赖Save.py的代码(比如equipment())会因变量丢失或状态异常触发未捕获的异常,最终导致程序直接退出。

修复方案

1. 放弃直接写入.py文件,改用更安全的JSON格式

JSON格式易读且不会干扰模块运行,是存档的首选方案:

修改保存函数

import json

def save_func():
    # 用with语句自动管理文件,无需手动调用close()
    with open("save_data.json", "w", encoding="utf-8") as f:
        # 把需要保存的数据打包成字典写入
        json.dump({"inv": inv}, f)
    choose_poi()

程序启动时加载存档

import json

# 初始化存档数据
inv = []
try:
    with open("save_data.json", "r", encoding="utf-8") as f:
        save_data = json.load(f)
        inv = save_data.get("inv", [])
except FileNotFoundError:
    # 第一次运行无存档文件,保持inv为空
    pass

2. 若坚持使用.py文件(不推荐)

  • 不要覆盖正在被导入的Save.py,换用其他文件名(比如save_storage.py)
  • 修复列表写入时的末尾逗号问题,避免语法错误
  • 用importlib.reload重新加载保存模块确保数据最新:
import importlib
import Save

def save_func():
    with open("save_storage.py", "w") as f:
        f.write("inv = [")
        # 处理元素,避免末尾多余逗号
        items = [f"'{x}'" for x in inv]
        f.write(", ".join(items))
        f.write("]\n")
    # 重新加载保存模块
    importlib.reload(Save)
    choose_poi()

3. 排查崩溃的具体原因

在关键函数中添加异常捕获,打印错误信息就能明确崩溃根源:

def save_func():
    try:
        file_builder = open("Save.py", "w+")
        file_builder.write("inv = [")
        for x in inv:
            file_builder.write(f"'{x}', ")
        file_builder.write("]\n")
        file_builder.close()
        choose_poi()
    except Exception as e:
        print(f"保存时出错:{e}")
        input("按回车继续...")
        choose_poi()

额外优化建议

  • 把choose_poi()中的多个if改成elif,减少多余判断
  • 在函数末尾添加无效指令处理,确保菜单循环正常:
def choose_poi():
    cls.cls()
    equipment()
    player = input('Type "city" to go to the City\nType "forest" to go to the Forest\nType "inv" to check your inventory\nType "craft" to craft an item\nType "save" to save your progress\nType "stop" to close the program\n')
    if player == "city":
        enter_city()
    elif player == "forest":
        enter_forest()
    elif player == "inv":
        invcheck()
    elif player == "craft":
        crafting()
    elif player == "stop": 
        sys.exit() 
    elif player == "save":
        save_func()
    else:
        # 输入无效时回到菜单
        choose_poi()

内容的提问来源于stack exchange,提问作者Connor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 07:14:59