
本文介绍在受限条件下(禁用 split、字典和 with 语句)从格式化文本文件(如 game.txt)中按“姓名+分数”交替结构读取数据,并分别存入玩家姓名列表和高分列表的可靠实现方法。
本文介绍在受限条件下(禁用 split、字典和 with 语句)从格式化文本文件(如 game.txt)中按“姓名+分数”交替结构读取数据,并分别存入玩家姓名列表和高分列表的可靠实现方法。
在处理结构化文本数据时,若文件以严格交替方式存储(即每两行为一组:第1行为姓名、第2行为整数分数),最稳妥且符合题目约束的方案是每次读取两行,并分别处理。由于题目明确禁止使用 split()、dict 和 with 语句,我们需采用显式文件打开/关闭 + readline() + strip() 的基础组合。
以下为符合所有限制条件的完整实现:
def read_file(filename):
player_names = []
high_scores = []
infile = open(filename, 'r')
try:
while True:
# 读取姓名行
name_line = infile.readline()
if not name_line: # 文件结束(空字符串表示 EOF)
break
name = name_line.rstrip('\n') # 禁用 split,故用 rstrip 去换行符
# 读取对应分数行
score_line = infile.readline()
if not score_line: # 姓名后无分数行,数据不完整,终止
break
score_str = score_line.rstrip('\n')
# 将分数字符串转为整数(题目要求存数字,非字符串)
try:
score = int(score_str)
except ValueError:
raise ValueError(f"Invalid score format: '{score_str}'")
player_names.append(name)
high_scores.append(score)
finally:
infile.close() # 确保文件始终关闭,即使发生异常
return player_names, high_scores
# 调用示例
FILENAME = "game.txt"
names, scores = read_file(FILENAME)
print("Player Names:", names)
print("High Scores:", scores)
✅ 关键设计说明:
- 使用
readline()逐行读取,避免一次性加载全部内容; -
rstrip('\n')替代split()实现换行符剥离; - 循环中先读姓名、再读分数,天然匹配文件的
name\nscore\n交替结构; -
try...finally保证close()必然执行,符合资源安全规范; - 对分数做
int()转换与异常捕获,增强健壮性。
⚠️ 注意事项:
- 文件必须严格成对存在(偶数行),否则末尾单行会被忽略;
- 若文件为空或首行为空,循环会立即退出,返回空列表;
- 不依赖
with语句,但通过finally实现同等安全性; - 所有操作均未使用
split()、dict或高级内置函数(如map、zip),完全满足学校作业要求。
该方法逻辑清晰、可读性强,适用于教学场景下的基础文件 I/O 训练,同时具备生产级的错误防御意识。










