
本文介绍在限制条件下(禁用 split、字典、with 语句)安全读取结构化文本文件,逐对提取姓名和分数并分别存入两个列表的完整实现方法,包含错误处理、类型转换和代码规范说明。
本文介绍在限制条件下(禁用 split、字典、with 语句)安全读取结构化文本文件,逐对提取姓名和分数并分别存入两个列表的完整实现方法,包含错误处理、类型转换和代码规范说明。
在处理如 game.txt 这类交替存储“姓名”和“分数”的纯文本文件时,关键在于按逻辑对读取:每两行构成一条有效记录——第1行为玩家名(字符串),第2行为高分(需转为整数)。由于题目明确禁止使用 split()、字典和 with 语句,我们必须采用基础文件操作配合循环控制,确保稳健性和可读性。
以下为符合所有约束的推荐实现:
def read_file(filename):
player_names = []
high_scores = []
infile = open(filename, 'r')
try:
while True:
# 读取姓名行
name_line = infile.readline()
if not name_line: # 文件结束(无内容可读)
break
name = name_line.rstrip('\n') # 仅去除换行符,不调用 split()
# 读取分数行
score_line = infile.readline()
if not score_line: # 姓名后无对应分数(格式异常)
break
score_str = score_line.rstrip('\n')
# 转换为整数并存入列表
try:
score = int(score_str)
player_names.append(name)
high_scores.append(score)
except ValueError:
# 跳过无法转为整数的行(增强鲁棒性)
continue
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(); -
try/finally结构替代with,保障文件资源可靠释放; - 每次循环读取两行,天然匹配数据配对逻辑,避免索引越界或错位;
- 内置
int()转换与ValueError捕获,防止非数字分数导致程序崩溃; - 显式检查
readline()返回值是否为空字符串('')或None,精准判断文件末尾。
⚠️ 注意事项:
- 若文件行数为奇数(如末尾多出一个姓名而无对应分数),该实现会自动终止,不产生错误数据;
- 确保
game.txt编码为 UTF-8(默认),避免中文姓名出现乱码; - 不建议在循环中重复调用
readline().rstrip('\n')后再赋值给同一变量——原问题代码中for item in FILENAME:属于逻辑错误(误将文件名当可迭代对象),已彻底修正。
此方案简洁、合规、健壮,适用于教学场景中对基础 I/O 和流程控制的理解与实践。










