7. if条件判断语句输出txt文件分数中的最大值

文摘   2024-05-09 22:25   云南  


【目录】


  • 1. 目标任务-输出txt文件分数中的最大值

  • 2. 知识回顾-readlines()按行读取文件

  • 3. 代码解析

  • 4. 获取data.txt文件


【正文】

1. 目标任务-输出txt文件分数中的最大值

提供data.txt文件,部分数据如下图所示:

1-数据

第1列表示姓名:李涵剑
第2列表示班级:经济191
第3列表示分数:430

ANSI表示编码方式。
在简体中文Windows系统中,ANSI通常指的是GBK编码。

【目标任务】

输出data.txt文件中分数最高的学生,打印输出学生的姓名和分数,中间用英文冒号隔开。

【示例】

李四:450

2. 知识回顾-readlines()按行读取文件

read[riːd]:读取。
lines[laɪnz]:行。
readlines:按行读取文件。

【语法】

文件对象.readlines()

【语法解析】

  • 文件对象
  • 英文小圆点·
  • readlines:方法名
  • 英文圆括号( )

【参数】

该方法没有参数。

【返回值】

返回值:返回一个列表。该列表包含了文件的所有行。

【课堂练习】

已知示例.txt文件内容如下所示:

2-示例

下面我们用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


安迪python学习笔记
python学习笔记,适合初学者。
 最新文章