上节课讲到字典,我们用循环遍历字典并输出了成绩,在屏幕上显示出来。假如你是学习委员,现在老师让你把程序的计算结果发给他,你会怎么处理?
你当然不能把程序发给老师,老师不一定安装Python的开发环境;如果用QQ或微信,也不是长久保存信息的方法。这种情况下,我们就需要用文件的方式来保存和传递数据了。
其实,我们在使用计算机的时候,就在不断地和各种各样的“文件”打交道,以前学习Scratch的时候,我们会把程序保存成一个.sb3文件;现在我们学习Python,会把写好的程序保存成.py文件,不同的文件后缀称为它们的“扩展名”,一般来说,我们只要看到常见的扩展名,就知道这个文件存储的数据类型。
文件本质上是数据的序列,可以包含任何数据内容。文件根据保存的数据类型可以分为文本文件和二进制文件,文本文件可以看作储存在计算机中的长字符串;而二进制文件是非字符的、特定格式的文件,比如我们png格式的图片、mp3格式的音频、mp4格式的视频文件等等。
在当前阶段,我们先学会怎么操作文本文件就可以了,这样至少能把我们平时做程序的输出保存下来。
一、文件打开与关闭
Python对文件的操作可以分为三个步骤:打开——操作——关闭。常见的操作方式有读取文件数据,创建空白文件并写入数据、在现有文件后面追加数据等。
使用Python提供的open()函数可以打开文件 ,它接收两个参数:文件名和打开模式。文件操作完成之后可以使用close()函数关闭它。
变量名 = open('<文件名>','打开模式')
变量名.close()
第一个参数“文件名”是一个字符串,如果要打开的文件和你的程序在一个目录,你可以只提供文件名,不提供路径;否则就需要提供完整的路径。在哪里找路径呢?如果你使用windows操作系统,可以右键点击文件,在弹出的菜单中点击“属性”,就可以在弹出的对话框中找到文件路径了。需要注意的是,Windows的文件路径分隔符是“\”,它也是Python的字符串转义符,所以我们一般会用斜杠“/”来代替“\”。比如“C:\test.txt”可以写成“C:/test.txt”。当然,你也可以写成“C:\test.txt”。
第二个参数“打开模式”也是字符串,有以下几种取值:
打开模式 | 含义 |
---|---|
r | 只读模式(默认值),若文件不存在会报错 |
w | 覆盖写模式,若文件不存在会创建新文件,若文件存在会覆盖原来的文件内容 |
x | 创建写模式,若文件不存在则创建新文件,若文件存在会报错 |
a | 追加写模式,若文件不存在则创建新文件,若文件存在则在最后追加内容 |
+ | 与前面的 r/w/x/a 一同使用,在原功能基础上增加同时读写功能 |
第二个参数如果省略,代表是只读,即默认打开方式 “r”。
二、读取文件
打开文件后,Python提供三种读取文件的方法:
- f.read():以字符串形式返回读取的数据,若传递一个参数代表读取字符数,不传递代表读取整个文件;
- f.readline():读取文件一行内容,以字符串形式返回。若传递一个参数,则表示读取该行的字符数;
- f.readlines():读取文件中的所有行,以列表形式返回数据。列表中每个元素就是文件中的一行;若传递一个参数,代表读取的行数。
f = open('test.txt') # 以只读模式打开程序目录下的test.txt文件
# 第一种方式读取
content = f.read()
print(content)
# 让文件指针回到开头重新读
f.seek(0)
# 第二种读取方式
list1 = f.readlines()
for i in list1:
print(i)
f.close()
如果文件很大,一次性读取文件所有内容速度会很慢,这时可以把文件作为一个序列对待,用for循环遍历,如:
f = open('test.txt') # 以只读模式打开程序目录下的test.txt文件
for i in f:
print(i)
f.close()
三、写入文件
Python提供了两种写入文件的方法:
- f.write():接收一个字符串参数,将该字符串写入文件
- f.writelines():接收一个字符串列表为参数,将序列中元素写入文件
如:
f = open('poem.txt', 'w') # 以覆盖写模式打开文件
f.write('白日依山尽,\n黄河入海流。\n欲穷千里目,\n更上一层楼') # 写入四行诗句
f.close()
四、成绩写入示例
上一节课的作业,我们要求处理五位同学的成绩并输出。现在我们完成这个作品,并把结果写入到文件中:
score = {
'欢欢':[99,98,97],
'乐乐':[100,98,87],
'天天':[97,88,94],
'格格':[85,93,92],
'图图':[100,99,98],
}
list1 = []
list1.append('姓名\t语文\t数学\t英语\t总分\t平均分\n')
for i,j in score.items():
list1.append(i + '\t' + str(j[0]) + '\t' + str(j[1]) + '\t' + str(j[2]) + '\t' + str(sum(j)) + '\t' + str(sum(j)/3) + '\n')
f = open('score.txt','w')
f.writelines(list1)
f.close()
五、课后作业
第8课课后作业是判断法定结婚年龄,如下:
在列表1、列表2中分别存储着五个人的姓名和他们的身份证号:
- 列表1:[‘张三’,’李四’,’王五’,’赵六’,’孙七’]
- 列表2:[‘410305200801057425’, ‘410311198009065550’, ‘410301197611238426’, ‘410302199811257326’, ‘41030820212234’]
请编写程序,根据每个人的身份证号,循环判断每个人是否到达法定结婚年龄。
注:
- 法定结婚年龄的判断标准是:男性22岁,女性20岁。
- 身份证号码中的第17位数字是如果是奇数性别为男,偶数则为女。 – 身份证号中第7-14位代表出生年月日,可以用于计算年龄。
程序要按以下格式输出:
张三:XX岁,性别X,达到/未达到法定结婚年龄
李四:XX岁,性别X,达到/未达到法定结婚年龄
……
请改造这个程序,把输出结果保存到文本文件中。