天外来信
2018-09-08王丽丽
王丽丽
情境导入
忽然有一天,阿派收到一封外面世界的来信,他迫不及待地开始读信,却发现信件内容全是一串一串的数字……
在这一课中,学生将学习如何利用Python读写文件及其拓展应用。
读信
在阿派读信之前,先来了解一下Python是如何读取文件的。
1.Python读取文件
(1)读取文件的简单示例
关于文件的基本处理主要有文件的打开、操作和关闭。如表1,利用open()打开letter.txt文件,并返回一个名为f的文件对象。其中,打开文件的模式有只读、写入、追加等,默认的文件访问模式为只读(r)。表1的程序运行后,将会读取如图1的文件letter.txt,运行的结果如图2。
(2)read()方法
当read()的括号内为空或负数时,将读取文件的所有内容。如果调用f.read(size),size是一个可选的数字类型的参数,则将读取指定的数据。比如,将表1的第3行代码修改为print(f.read(5)),则程序运行结果如图3。
(3)readline()方法
f.readline()会从文件中读取当前指针下一行内容的字符串。比如,将表1的第3行代码修改为print(f.readline()),则程序运行结果如下页图4。如果将第3行修改为2行readline(),则运行效果如下页图5,由于print默认换行,会在输出一行字符串后产生一行空行。如果不想产生空行,则将代码修改为print(f.readline(), end=''),其中的end=''表示print输出之后不换行。
(4)readlines()方法
f.readlines()将返回整个文件内容的列表,每一项是以换行符结尾的一行字符串。比如,将表1的第3行代码修改为print(f.readlines()),则程序运行结果如下页图6。
(5)for line in f:的作用
如下页表2,利用for line in f:可以实现文件的遍历。这种做法在读取文件时,不是一次性读取全部文件,而是采用每次读取一行的方式。
关于文件的读取模式,除了r(只读)模式以外,还有rb模式,表示以二进制格式打开一个文件用于只读。另外,还有r+模式,表示打开一个文件用于读写。还有rb+模式,可以用二进制格式打开一个文件用于读写。以上四种模式,文件指针都会放在文件的开头。
2.破译天外来信
在了解了Python读取文件的基本操作后,我们和阿派一起来解读那封全是数字的信件。信件的内容如下页图7,为十行数字。如果按照一定的规则来读信,可以将其解读为如图8的图案。具体的规则是:每一行为一组数据。第1个数字表示前进的像素;第2个数字为0表示左转,1表示右转;第3个数字表示旋转角度;第4~6个数字分别表示RGB颜色。据此规则,第1行数字表示向默认的水平向右的方向绘制一条红色的直线,再向右旋转144度。
结合turtle库,利用如图9的核心代码,可以实现如图8的信件图案的绘制效果。其中的第4行代码中,line.split(‘,)表示以逗号区分间隔,对字符串切片。map(float,line.split(‘,))表示对指定序列做映射,将每一个元素转为浮点数。list表示将结果保存为列表,比如[300.0, 1.0, 144.0, 1.0, 0.0, 0.0]。result.append表示追加到result列表中。第5行代码将读取的信件内容输出至屏幕,效果如图10。第6~12行代码实现了绘制图案的过程。
对于信件中的那一串串数字,我们还可以使用不同的规则来解读,当然所绘制的图案也就不同。
回信
1.Python写入文件
利用write()方法,可以将数据写入指定文件中。如图11,先打开已有文件或新建一个空白的文本文档reply.txt,利用input函数提示用户输入回信内容,并将输入的字符串写入reply文件,再读取信件内容,并关闭文件。其中,f.seek(0)表示重新设置文件读取指针到开头。如图12,利用a+模式还可以追加信件内容。
常用的文件写入模式有w模式,表示打开一个文件且只能写入。如图11中w+模式表示打开一个文件用于读写。w和w+模式下,如果该文件已存在則将其覆盖。如果该文件不存在,创建新文件。图12的a+模式表示打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾,即追加模式。如果该文件不存在,则创建新文件用于读写。
2.回信
第119页的图11~12的文件写入方式,都只能写入一行数据。一般情况下,正式的写信,需要输入多行文本,直至输入为空时,表示写信结束。如第119页图13,我们可以利用while循环语句实现多行回信的功能。而在按下两次回车键后,即输入为空时,会返回信件内容(如第119页图14)。
参照阿派破译数字信件的过程,你也可以逆向设计,将回信内容设置为几行数字,并按照特定规则来读取,实现特定的图案效果。
在Python中的文件读写,还有其他的拓展应用,如读取Excel文件,或者利用matplotlib第三方库来绘制2D图表等,你可以根据实际需要来进行设计和应用。