游戏保存时程序意外关闭?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
相关产品推荐
相关产品推荐

