文本类游戏存档问题:如何修改文件中已保存字典的值以覆盖旧存档(解决重复加载初始存档故障)
The core problem with your current code is that you're using the a+ file mode, which appends new content to the file instead of overwriting the existing save data. This leads to multiple conflicting entries in your save file, and your load logic is likely picking up the first (oldest) entry instead of the latest progress.
Here's a step-by-step solution to fix this:
Key Improvements Needed
- Read existing save data first: Always load the current saved state before updating it, so you don't lose existing data like the player's name.
- Overwrite the file, don't append: Use
wmode to replace the entire file with the updated save dictionary every time you save. - Safer parsing: Use
ast.literal_eval()instead of raweval()to convert the saved string back to a dictionary (prevents security risks from corrupted files). - Context managers: Use
withstatements to automatically handle file closing, avoiding resource leaks.
Corrected Code Implementation
First, import the necessary module for safe parsing:
import ast
Helper Function to Load Save Data
This function reads the save file (or creates an empty dict if the file doesn't exist):
def load_save(): try: with open("save_game.txt", "r") as file: content = file.read().strip() # Only parse if the file has content if content: return ast.literal_eval(content) else: return {} except FileNotFoundError: # Return empty dict if save file doesn't exist yet return {} except (SyntaxError, ValueError): # Handle corrupted save files gracefully print("Warning: Corrupted save file detected. Starting fresh.") return {}
General Save Progress Function
This function updates the save data and overwrites the file with the latest state:
def save_progress(key, value): # Load existing save data saved = load_save() # Update the specific key with new value saved[key] = value # Write the complete updated dictionary to the file with open("save_game.txt", "w") as file: file.write(str(saved))
Specific Save Functions (Optional but Clean)
You can create dedicated functions for saving name and position to keep your code organized:
def save_name(name): save_progress("Name", name) def save_position(position): save_progress("Position", position)
How to Use These Functions
- When saving the player's name:
save_name("YourPlayerName") - When updating the player's position:
save_position(3) - When loading progress:
current_save = load_save() player_name = current_save.get("Name", "Anonymous") # Default name if no save exists player_position = current_save.get("Position", 1) # Default to starting position
Result
Your save_game.txt file will now always contain exactly one complete dictionary (e.g., {'Name': 'Alice', 'Position': 3}) instead of multiple appended entries. Every save overwrites the file with the latest progress, so loading will always pull the most recent state.
内容的提问来源于stack exchange,提问作者sxormer raid

