本节概要
- 读写文件
- 按指定字符分割字符串
程序实例10
在上一节中我们学习了如何利用字典将学生姓名和成绩关联起来。但是这个程序仍然不完善,比如学生信息都是写在代码中的,每次我们修改学生信息的时候都要修改代码十分不方便。而且输出的信息没有保存,随着程序关闭输出信息也丢失了。
在本节中我们将学习读写文件操作,这样我们就可以从一个文件里读取学生信息,然后再把处理后的学生信息保存到一个文件中了。这样不仅方便我们修改输入信息,而且对于输出信息我们可以持久保存。
下面给出一个读取文件的示例代码。在下面的代码中,我们将读取一个名叫test.txt的文本文件,然后把文件内容都读取到内存中,最后通过for循环依次打印每一行的内容。
with open("test.txt", "r") as fin:
for line in fin.readlines():
print(line)
with open("test.txt", "r") as fin是一种安全地打开文件的方式。"test.txt"实际上是要读取文件的路径,但是关于文件路径不是三言两语能介绍清楚的(文件路径涉及到相对路径,绝对路径等概念,并且在不同操作系统上表示的方式还略有差别)。
在入门篇中为了突出重点淡化次要点,我们就先避开文件路径这个概念。这里只要把"test.txt"文件和你的程序文件放在同一个目录下,我们就可以通过文件名"test.txt"直接打开文件了。在open()中的参数"r"代表read,意思是说打开这个文件是要读这个文件中的内容。
fin.readlines()我们可以理解为一个列表,这个列表是由test.txt文件中一行一样内容组成的。假设test.txt文件中写了4行内容:
锄禾日当午,
汗滴禾下土。
谁之盘中餐,
粒粒皆辛苦。
那么fin.readlines()我们可以把它当成列表["锄禾日当如,", "汗滴禾下土。", "谁之盘中餐,", "粒粒皆辛苦。"]。在这里我们介绍了另一种for循环遍历列表的方式,因此我们现在有两种方式来遍历列表了。
names = ["张三", "李四", "王五"]
# 方法1
for i in range(len(names)):
print(names[i])
# 方法2
for name in names:
print(name)
接下来我们介绍写文件操作。把open("test.txt", "r")中的"r"改为"w"就是以写的方式打开文件了,然后通过write()就可以写入内容。示例程序如下:
with open("students_info.txt", "w") as fout:
fout.write("张三 97分 优秀\n")
按照上面的方式会向students_info.txt文件中写入一行内容“张三 97分 优秀”,\n表示换行符。在linux和windows环境中换行符是不一样的,但是不用担心,采用上面的写法python会根据系统自动更改\n为系统换行符,所以这里写\n就好。
至此,我们已经学会了读写文件操作。让我们回到学生成绩录入程序中。假设我们在输入文件中每行写一名学生的姓名和成绩,姓名和成绩用一个空格符隔开,如下所示:
张三 97
李四 70
王五 85
我们可以通过把每行内容按照空格分割,然后解析出学生姓名和成绩。利用split()方法可以把一个字符串按指定符号分割,分割后的结果以列表返回。示例如下:
>>> line = "abc def xyz"
>>> line.split(" ") # 也可写作line.split(),无参数的时候按照空白符分割,空格符包括空格符,制表符,换行符等
>>> ["abc", "def", "xyz"]
现在我们给出完整的程序代码。我们从文件input_data.txt读取每位学生的姓名和成绩,每行一位学生的姓名和成绩,姓名和成绩用空格符分开。然后我们根据学生的成绩转化为等级。最后把学生姓名,成绩,等级再写入到students_info.txt文件中。
with open("input_data.txt", "r") as fin, open("students_info.txt", "w") as fout:
for line in fin.readlines():
infos = line.strip().split() # strip()的作用是去除字符串首尾的空白符,因为读入的每行内容结尾包含换行符,因此需要去除
name = infos[0]
score = infos[1]
# 上面三行代码可以简写为一行: name, score = line.strip().split()
score = int(score)
if score >= 60:
level = "及格"
else:
level = "不及格"
fout.write("{0} {1} {2}\n".format(name, score, level))
input_data.txt文件中的内容如下:
张三 97
李四 50
王五 68
把input_data.txt文件和程序文件放在同一目录下,然后运行上面的程序。程序会生成students_info.txt文件,students_info.txt文件中会保存如下内容:
张三 97 及格
李四 50 不及格
王五 68 及格
注意:运行如果输出结果出现乱码,可以把open("input_data.txt", "r")改为open("input_data.txt", "r", encoding="utf8")。出现乱码的原因是输入文件的编码可能不是utf8造成的,关于编码问题在入门篇中暂不介绍。
本节总结
本节主要介绍的内容包括:
- 读写文件的方式,通过with open()安全打开文件,通过"r"或者"w"参数控制读或写文件。
- 读取文件时,可以通过split()函数按照指定符号分割字符串,strip()方法可以剔除字符串首尾的空白符。
在本节中我们学习了如何读写文件以及如何按照指定符号分割字符串。学会了本节的内容之后,我们就可以把数据和程序分开了。输入的信息单独保存在一个文件中,程序处理后的信息保存在另一个文件中。下一节我们将学习如何定义函数。我们下一节再见吧。