Python游戏存档功能问题:读取文件生成的列表未包含最新添加的用户首字母与分数
问题分析与解决方案
我帮你梳理下代码里的几个关键问题,这就是你读不到最新内容、修改无效的核心原因:
1. 文件指针位置错误
你写完内容后直接调用Names.readlines(),这时候文件指针已经跑到文件末尾了,自然读不到任何内容。要读取刚写入的内容,必须先把指针移回文件开头,用Names.seek(0)才行。
2. 文件句柄重复操作的冲突
你先对Names进行了写入和读取操作,之后又用with open('Names.txt','r+') as Names重新打开了文件——这时候新的文件句柄和之前的是完全独立的,之前操作的line变量和新打开的文件没有任何关联,导致后续修改列表后写入的逻辑完全错位。
3. r+模式写入的坑
用r+模式打开文件时,写入操作是从当前文件指针位置开始覆盖内容,而不是替换整个文件。如果直接在这种模式下修改后写入,很容易导致文件内容混乱(比如旧内容没被完全覆盖,出现重复或残留)。
修正后的完整代码示例
我把你的逻辑重构了一下,确保流程清晰且正确:
# 假设username和score是用户输入的首字母和游戏分数 username = input("请输入你的首字母:").strip() score = 100 # 这里替换为你的实际游戏分数 username_score = f"{username} {score}" file_path = "Names.txt" # 第一步:读取现有存档,检查用户是否已存在 user_exists = False lines = [] try: with open(file_path, 'r') as f: lines = f.readlines() # 遍历查找目标用户,存在则更新分数 for idx, line in enumerate(lines): if username in line.strip(): lines[idx] = f"{username_score}\n" user_exists = True break except FileNotFoundError: # 如果文件不存在,初始化空列表 pass # 第二步:用户不存在则添加新存档条目 if not user_exists: lines.append(f"{username_score}\n") # 第三步:将修改后的内容覆盖写入文件 with open(file_path, 'w') as f: f.writelines(lines) # 验证读取结果 with open(file_path, 'r') as f: print("当前存档内容:") print(f.read())
关键改进点
- 先读再写的安全模式:先把所有内容读到列表里修改,再用
w模式覆盖写入,确保内容完全更新,不会出现覆盖混乱的问题。 - 处理文件不存在的场景:用
try-except捕获文件不存在的异常,避免程序报错崩溃。 - 逻辑拆分更清晰:把“检查用户”“更新/添加条目”“写入文件”拆成独立步骤,不仅容易理解,也方便后续调试扩展。
内容的提问来源于stack exchange,提问作者LavaKey
相关产品推荐
相关产品推荐

