【目录】
1. 目标任务-输出txt文件分数中的最大值
2. 知识回顾-readlines()按行读取文件
3. 代码解析
4. 获取data.txt文件
【正文】
1. 目标任务-输出txt文件分数中的最大值
提供data.txt文件,部分数据如下图所示:
第1列表示姓名:李涵剑
第2列表示班级:经济191
第3列表示分数:430
ANSI
表示编码方式。
在简体中文Windows系统中,ANSI通常指的是GBK编码。
【目标任务】
输出data.txt文件中分数最高的学生,打印输出学生的姓名和分数
,中间用英文冒号
隔开。
【示例】
李四:450
2. 知识回顾-readlines()按行读取文件
read[riːd]:读取。
lines[laɪnz]:行。
readlines:按行读取文件。
【语法】
文件对象.readlines()
【语法解析】
文件对象 英文小圆点 ·
readlines:方法名 英文圆括号 ( )
【参数】
该方法没有参数。
【返回值】
返回值:返回一个列表。该列表包含了文件的所有行。
【课堂练习】
已知示例.txt
文件内容如下所示:
下面我们用readlines( )读取该文件。
注意这里的txt文件编码方式为UTF-8。
【代码示例】
with open("示例.txt", "r") as f:
lines = f.readlines()
print(lines)
【终端输出】
UnicodeDecodeError:
'gbk' codec can't decode byte 0x91 in position 8: illegal multibyte sequence
运行上面的代码,程序报错翻译如下:
Unicode编码错误:gbk编解码器无法解码位置8的字节0x91:非法的多字节序列。
意思就是解码方式不对。
因为 with open
函数在没有指定encoding参数时,默认解码方式是gbk。
因为文档编码方式是UTF-8,要正确读取文件,需要将解码方式修改为UTF-8
。
【代码示例】
# 使用with语句以只读模式"r"打开名为"示例.txt"的文件
# 指定文件编码为UTF-8
# 将文件对象赋值给变量f
with open("示例.txt", "r",encoding="UTF-8") as f:
# 使用readlines()方法读取文件的所有行,并将结果存储在变量lines中
# lines的数据类型为列表
lines = f.readlines()
print(type(lines))
print(lines)
【终端输出】
<class 'list'>
['李涵剑:经济191,430\n',
'赵康剑:会计191,541\n',
'冯剑健:经济191,549\n',
'赵一一:机械191,301\n',
'冯风琳:计算191,352\n',
'王林林:经济191,577']
3. 代码解析
# 使用with语句打开名为"data.txt"的文件
# data.txt不是文件名,是相对路径
# r是只读模式读取文件
# 打开后将其赋值给变量f
# with语句可以确保文件在操作完成后自动关闭
# 在简体中文Windows系统中,ANSI通常指的是GBK编码,因此这里不用添加encoding参数
with open("data.txt", "r") as f:
# readlines()方法按行读取文件
# 返回的数据类型为列表
# 每行就是列表lines的一个元素
lines = f.readlines()
# 初始化最高分数为-1
max_score = -1
# 初始化最高分数的学生姓名为空字符串
max_name = ""
# 遍历lines列表
for line in lines:
# 第1次取值 line='李涵剑:经济191,430\n',数据类型为字符串
# line.strip()移除字符串尾部的换行符\n,此时line='李涵剑:经济191,430'
# split(':')用冒号对line字符串进行分隔,此时得到列表['李涵剑', '经济191,430']
# [0]表示取列表的第1个元素,即'李涵剑',然后赋值给变量name
# split(',')用逗号对line字符串进行分隔,此时得到列表['李涵剑:经济191', '430']
# [1]表示取列表的第2个元素,即'430',然后赋值给变量score
name, score = line.strip().split(':')[0], line.strip().split(',')[1]
# 要查看name和score的值可以把下面的#号删除即可
#print(name)
#print(score)
# 判断当前学生的分数是否大于最高分数
# 第1次取值:430>-1
if int(score) > max_score:
# 如果当前学生的分数大于最高分数,则更新最高分数为当前学生的分数
# 上面的判断成立:此时max_score=430
max_score = int(score)
# 同时更新最高分数的学生姓名为当前学生的姓名
# max_name=李涵剑
max_name = name
# f"{name}:{score}\n"是一个格式化字符串
# {name}和{score}分别表示变量name和score的值
print(f"{max_name}:{max_score}")
【终端输出】
李华天:620
4. 获取data.txt文件
1.添加微信:xyz77520520
2.发送:粉丝答疑6-data.txt