王麗麗
忽然有一天,阿派收到一封外面世界的來(lái)信,他迫不及待地開(kāi)始讀信,卻發(fā)現(xiàn)信件內(nèi)容全是一串一串的數(shù)字……
在這一課中,學(xué)生將學(xué)習(xí)如何利用Python讀寫(xiě)文件及其拓展應(yīng)用。
在阿派讀信之前,先來(lái)了解一下Python是如何讀取文件的。
1.Python讀取文件
(1)讀取文件的簡(jiǎn)單示例
關(guān)于文件的基本處理主要有文件的打開(kāi)、操作和關(guān)閉。如表1,利用open()打開(kāi)letter.txt文件,并返回一個(gè)名為f的文件對(duì)象。其中,打開(kāi)文件的模式有只讀、寫(xiě)入、追加等,默認(rèn)的文件訪問(wèn)模式為只讀(r)。表1的程序運(yùn)行后,將會(huì)讀取如圖1的文件letter.txt,運(yùn)行的結(jié)果如圖2。
(2)read()方法
當(dāng)read()的括號(hào)內(nèi)為空或負(fù)數(shù)時(shí),將讀取文件的所有內(nèi)容。如果調(diào)用f.read(size),size是一個(gè)可選的數(shù)字類型的參數(shù),則將讀取指定的數(shù)據(jù)。比如,將表1的第3行代碼修改為print(f.read(5)),則程序運(yùn)行結(jié)果如圖3。
(3)readline()方法
f.readline()會(huì)從文件中讀取當(dāng)前指針下一行內(nèi)容的字符串。比如,將表1的第3行代碼修改為print(f.readline()),則程序運(yùn)行結(jié)果如下頁(yè)圖4。如果將第3行修改為2行readline(),則運(yùn)行效果如下頁(yè)圖5,由于print默認(rèn)換行,會(huì)在輸出一行字符串后產(chǎn)生一行空行。如果不想產(chǎn)生空行,則將代碼修改為print(f.readline(), end=''),其中的end=''表示print輸出之后不換行。
(4)readlines()方法
f.readlines()將返回整個(gè)文件內(nèi)容的列表,每一項(xiàng)是以換行符結(jié)尾的一行字符串。比如,將表1的第3行代碼修改為print(f.readlines()),則程序運(yùn)行結(jié)果如下頁(yè)圖6。
(5)for line in f:的作用
如下頁(yè)表2,利用for line in f:可以實(shí)現(xiàn)文件的遍歷。這種做法在讀取文件時(shí),不是一次性讀取全部文件,而是采用每次讀取一行的方式。
關(guān)于文件的讀取模式,除了r(只讀)模式以外,還有rb模式,表示以二進(jìn)制格式打開(kāi)一個(gè)文件用于只讀。另外,還有r+模式,表示打開(kāi)一個(gè)文件用于讀寫(xiě)。還有rb+模式,可以用二進(jìn)制格式打開(kāi)一個(gè)文件用于讀寫(xiě)。以上四種模式,文件指針都會(huì)放在文件的開(kāi)頭。
2.破譯天外來(lái)信
在了解了Python讀取文件的基本操作后,我們和阿派一起來(lái)解讀那封全是數(shù)字的信件。信件的內(nèi)容如下頁(yè)圖7,為十行數(shù)字。如果按照一定的規(guī)則來(lái)讀信,可以將其解讀為如圖8的圖案。具體的規(guī)則是:每一行為一組數(shù)據(jù)。第1個(gè)數(shù)字表示前進(jìn)的像素;第2個(gè)數(shù)字為0表示左轉(zhuǎn),1表示右轉(zhuǎn);第3個(gè)數(shù)字表示旋轉(zhuǎn)角度;第4~6個(gè)數(shù)字分別表示RGB顏色。據(jù)此規(guī)則,第1行數(shù)字表示向默認(rèn)的水平向右的方向繪制一條紅色的直線,再向右旋轉(zhuǎn)144度。
結(jié)合turtle庫(kù),利用如圖9的核心代碼,可以實(shí)現(xiàn)如圖8的信件圖案的繪制效果。其中的第4行代碼中,line.split(‘,)表示以逗號(hào)區(qū)分間隔,對(duì)字符串切片。map(float,line.split(‘,))表示對(duì)指定序列做映射,將每一個(gè)元素轉(zhuǎn)為浮點(diǎn)數(shù)。list表示將結(jié)果保存為列表,比如[300.0, 1.0, 144.0, 1.0, 0.0, 0.0]。result.append表示追加到result列表中。第5行代碼將讀取的信件內(nèi)容輸出至屏幕,效果如圖10。第6~12行代碼實(shí)現(xiàn)了繪制圖案的過(guò)程。
對(duì)于信件中的那一串串?dāng)?shù)字,我們還可以使用不同的規(guī)則來(lái)解讀,當(dāng)然所繪制的圖案也就不同。
1.Python寫(xiě)入文件
利用write()方法,可以將數(shù)據(jù)寫(xiě)入指定文件中。如圖11,先打開(kāi)已有文件或新建一個(gè)空白的文本文檔reply.txt,利用input函數(shù)提示用戶輸入回信內(nèi)容,并將輸入的字符串寫(xiě)入reply文件,再讀取信件內(nèi)容,并關(guān)閉文件。其中,f.seek(0)表示重新設(shè)置文件讀取指針到開(kāi)頭。如圖12,利用a+模式還可以追加信件內(nèi)容。
常用的文件寫(xiě)入模式有w模式,表示打開(kāi)一個(gè)文件且只能寫(xiě)入。如圖11中w+模式表示打開(kāi)一個(gè)文件用于讀寫(xiě)。w和w+模式下,如果該文件已存在則將其覆蓋。如果該文件不存在,創(chuàng)建新文件。圖12的a+模式表示打開(kāi)一個(gè)文件用于讀寫(xiě)。如果該文件已存在,文件指針將會(huì)放在文件的結(jié)尾,即追加模式。如果該文件不存在,則創(chuàng)建新文件用于讀寫(xiě)。
2.回信
第119頁(yè)的圖11~12的文件寫(xiě)入方式,都只能寫(xiě)入一行數(shù)據(jù)。一般情況下,正式的寫(xiě)信,需要輸入多行文本,直至輸入為空時(shí),表示寫(xiě)信結(jié)束。如第119頁(yè)圖13,我們可以利用while循環(huán)語(yǔ)句實(shí)現(xiàn)多行回信的功能。而在按下兩次回車(chē)鍵后,即輸入為空時(shí),會(huì)返回信件內(nèi)容(如第119頁(yè)圖14)。
參照阿派破譯數(shù)字信件的過(guò)程,你也可以逆向設(shè)計(jì),將回信內(nèi)容設(shè)置為幾行數(shù)字,并按照特定規(guī)則來(lái)讀取,實(shí)現(xiàn)特定的圖案效果。
在Python中的文件讀寫(xiě),還有其他的拓展應(yīng)用,如讀取Excel文件,或者利用matplotlib第三方庫(kù)來(lái)繪制2D圖表等,你可以根據(jù)實(shí)際需要來(lái)進(jìn)行設(shè)計(jì)和應(yīng)用。