python實用教程第十二章文件操作課件_第1頁
python實用教程第十二章文件操作課件_第2頁
python實用教程第十二章文件操作課件_第3頁
python實用教程第十二章文件操作課件_第4頁
python實用教程第十二章文件操作課件_第5頁
已閱讀5頁,還剩30頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、第十二章 文件目前操作的程序都遵循著首先接收輸入數(shù)據(jù),然后按照要求進(jìn)行處理,最后輸出數(shù)據(jù)的方式進(jìn)行。但如果希望程序結(jié)束后,執(zhí)行的結(jié)果數(shù)據(jù)能夠保存下來,就不能使用前面的操作方式進(jìn)行了,需要尋找其他方式保存數(shù)據(jù),文件就是一個不錯的選擇。在程序運行過程中,可以將執(zhí)行結(jié)果保存到文件中。不過,這需要涉及對文件的操作。通過本章的學(xué)習(xí),讀者將了解如何使用Python在硬盤上創(chuàng)建、讀取和保存文件。Python快樂學(xué)習(xí)班的同學(xué)結(jié)束了正則表達(dá)尋寶后,導(dǎo)游帶領(lǐng)他們來到了文件魔法館。在文件魔法館,同學(xué)們將體驗從無到有的文件生成過程,也將體驗到空文件中突然顯現(xiàn)出文本內(nèi)容的過程,也將看到存在的文本內(nèi)容突然消失或突然變成另

2、一種字符的過程?,F(xiàn)在趕快跟隨Python快樂學(xué)習(xí)班的同學(xué)一同進(jìn)入文件魔法館一睹為快吧。第1頁,共35頁。12.1 操作文件在Python中,打開文件使用的是open()函數(shù)。Open()函數(shù)的基本語法格式如下:open(file_name , access_mode, buffering)在open()函數(shù)中,file_name參數(shù)是要訪問的文件名稱。access_mode參數(shù)是指打開文件的模式,對應(yīng)有只讀、寫入、追加等。access_mode變量值不是必需的(不帶access_mode變量時,要求file_name存在,否則報異常),默認(rèn)的文件訪問模式為只讀(r)。buffering參數(shù)表示

3、的是:如果buffering的值被設(shè)為0,就不會有寄存;如果buffering的值取1,訪問文件時就會寄存行;如果將buffering的值設(shè)為大于1的整數(shù),表示寄存區(qū)的緩沖大??;如果取負(fù)值,寄存區(qū)的緩沖大小就是系統(tǒng)默認(rèn)值。第2頁,共35頁。open()函數(shù)的返回值是一個File(文件)對象。File對象代表計算機(jī)中的一個文件,是Python中另一種類型的值,就像前面介紹的列表和字典,是Python中的一種數(shù)據(jù)類型。示例如下(file_open_1.py):path=D:/test.txtf_name=open(path)print(f_)程序輸出結(jié)果如下:D:/test.tx

4、t由輸出結(jié)果可以看到,打開的是D盤下的test.txt文件(執(zhí)行該程序前,確保在D盤下已經(jīng)創(chuàng)建了一個名為test.txt的文件。第3頁,共35頁。繼續(xù)介紹之前,先介紹如下幾個概念。(1)文件路徑:在上面的示例程序中,先定義了一個名為path的變量,變量值是一個文件的路徑。文件的路徑是指文件在計算機(jī)上的位置,如該示例程序中的d:/test.txt是指在d盤下文件名為test.txt的文件的位置。文件路徑又分為絕對路徑和相對路徑。(2)絕對路徑:總是從根文件夾開始。比如在Windows環(huán)境下,一般從C盤、D盤等開始,C盤、D盤稱為根文件夾,在該盤中的文件都得從根文件夾開始往下一級一級地查找。在Li

5、nux環(huán)境下,一般從user、home等根文件開始。比如在上面的示例程序中,path變量值就是一個絕對路徑,在文件搜索框中輸入絕對路徑可以直接找到該文件。(3)相對路徑:相對于程序當(dāng)前工作目錄的路徑。比如當(dāng)前工作文件存放的絕對路徑是D:/python/workspace,如果使用相對路徑,就可以不寫這個路徑,用一個“.”號代替這個路徑值。第4頁,共35頁。代碼示例如下(file_open_2.py):#path=D:/python/workspace/test.txt #使用絕對路徑path=./test.txt #使用相對路徑f_name=open(path, w)print(f_name.

6、name)程序輸出結(jié)果如下:./test.txt知識補充:除了單個點(.),還可以使用兩個點(.)表示父文件夾(或上一級文件夾)。此處不具體討論,有興趣讀者可以自己嘗試。第5頁,共35頁。12.1.1 文件操作模式open函數(shù)可以傳入mode參數(shù)和不傳入,mode可以傳入如下值:模式描述R以只讀方式打開文件。文件的指針將會放在文件的開頭。這是默認(rèn)模式。Rb以二進(jìn)制格式打開一個文件用于只讀。文件指針將會放在文件的開頭。這是默認(rèn)模式。r+打開一個文件用于讀寫。文件指針將會放在文件的開頭。rb+以二進(jìn)制格式打開一個文件用于讀寫。文件指針將會放在文件的開頭。W打開一個文件只用于寫入。如果該文件已存在則

7、將其覆蓋。如果該文件不存在,創(chuàng)建新文件。Wb以二進(jìn)制格式打開一個文件只用于寫入。如果該文件已存在則將其覆蓋。如果該文件不存在,創(chuàng)建新文件。w+打開一個文件用于讀寫。如果該文件已存在則將其覆蓋。如果該文件不存在,創(chuàng)建新文件。第6頁,共35頁。使用open函數(shù)時,如果指定mode參數(shù)的使用模式只為讀(r)模式,那么可以不需要指定mode參數(shù),即指定只讀模式和什么模式都不指定的效果是一樣的。如示例file_open_1.py中,就是使用的默認(rèn)模式讀test.txt文件。通過指定mode參數(shù),可以向文件寫入內(nèi)容,并且可以使用加號(+)參數(shù)。加號(+)參數(shù)可以用到其他任何模式中,加號(+)參數(shù)表示對文件

8、的讀和寫都是允許的。比如w+可以在打開一個文件時,對文件進(jìn)行讀和寫。當(dāng)mode參數(shù)帶上字母b時,表示可以用來讀取一個二進(jìn)制格式的文件。Python在一般情況下處理的都是文本文件,但也不能避免處理其他文件格式的文件。第7頁,共35頁。12.1.2 文件緩沖由open()函數(shù)的語法格式可以知道,open()函數(shù)的buffering參數(shù)是可選擇的,buffering參數(shù)用于控制文件的緩存。如果buffering參數(shù)為0或False,I/O(輸入/輸出)就是無緩存的。如果buffering參數(shù)為1或True,I/O(輸入/輸出)就是有緩存的。大于1的整數(shù)代表緩存的大?。▎挝皇亲止?jié)),-1或小于0的整數(shù)

9、代表使用默認(rèn)的緩存大小。這里引出了緩存和I/O兩個概念,下面分別進(jìn)行介紹。緩存一般指的是內(nèi)存。從數(shù)據(jù)讀寫的速度上比較,計算機(jī)從內(nèi)存中讀寫數(shù)據(jù)的速度遠(yuǎn)遠(yuǎn)大于從磁盤中讀寫數(shù)據(jù)的速度。從存儲大小方面比較,內(nèi)存一般比較小,而磁盤一般比較大,通常磁盤的存儲大小是內(nèi)存的幾十倍。第8頁,共35頁。I/O在計算機(jī)中指Input/Output,也就是輸入和輸出。由于程序在運行時,數(shù)據(jù)在內(nèi)存中駐留,由CPU這個超快的計算核心處理,涉及數(shù)據(jù)交換的地方通常是磁盤、網(wǎng)絡(luò)等,因此需要I/O接口。第9頁,共35頁。12.2 文件方法在I/O編程中,Stream(流)是一個很重要的概念??梢园蚜飨胂蟪梢粋€水管,數(shù)據(jù)就是水管里

10、的水,但是只能單向流動。Input Stream的操作是數(shù)據(jù)從外面(磁盤、網(wǎng)絡(luò))流進(jìn)內(nèi)存,Output Stream的操作是數(shù)據(jù)從內(nèi)存流到外面(磁盤、網(wǎng)絡(luò))。比如瀏覽網(wǎng)頁時,瀏覽器和服務(wù)器之間至少需要建立兩根水管(兩個流),才能既發(fā)送數(shù)據(jù)又接收數(shù)據(jù)。第10頁,共35頁。12.2.1 文件的讀和寫open()函數(shù)返回的是一個File對象,有了File對象,就可以操作文件內(nèi)容了。如果希望將整個文件的內(nèi)容以一個字符串的形式讀取出來,可以使用File對象的read()方法。File對象的read()方法用于從一個打開的文件中讀取字符串。需要注意,Python中的字符串可以是二進(jìn)制數(shù)據(jù),而不是僅僅是文字

11、。read()方法的語法格式如下:fileObject.read(count);fileObject為open()函數(shù)返回的File對象,count參數(shù)是從已打開的文件中讀取的字節(jié)計數(shù)。read()方法從文件的開頭開始讀入字符,如果沒有傳入count值,read()方法就會嘗試盡可能多地讀取文件內(nèi)容,可能一直讀取到文件的末尾。第11頁,共35頁。在test.txt文件中寫入“Hello world!Welcome!”,執(zhí)行如下代碼(file_read.py):path=./test.txtf_name=open(path,r)print(fread result:f_name.read(12)

12、代碼輸出結(jié)果如下:read result: Hello world!將語句print(read result:, f_name.read(12)更改為print(read result:, f_name.read(),則會得到的如下的輸出結(jié)果:read result: Hello world!Welcome!第12頁,共35頁。在Python中,使用write()方法向一個文件寫入數(shù)據(jù)。write()方法可將任何字符串寫入一個打開的文件。同樣需要注意,Python中的字符串可以是二進(jìn)制數(shù)據(jù),而不是僅僅是文字。write()的語法格式如下:fileObject.write(string);fil

13、eObject為write()方法返回的File對象,string參數(shù)是需要寫入文件中的內(nèi)容。write()方法返回寫入文件的字符串的長度。需要注意的是,write()方法不會在字符串結(jié)尾添加換行符(n)。第13頁,共35頁。示例如下(file_write.py):path=./test.txtf_name=open(path, w)print(fwrite length:f_name.write(Hello world!)程序輸出結(jié)果如下:write length: 12由輸出結(jié)果可以看到,使用write()方法向test.txt文件中寫入數(shù)據(jù)成功,并且寫入的是12個字符。第14頁,共35頁

14、。在Python中,寫文件方法的處理方式是:覆寫原有文件,從頭開始,每次寫入都會覆蓋前面所有內(nèi)容,就像用一個新值覆蓋一個變量的值。所以上面的輸出結(jié)果只有一行就是因為第二次的寫入覆蓋了第一次的寫入。需要提醒的一點:若傳遞給open()函數(shù)的文件名不存在,將mode參數(shù)設(shè)置為寫模式(w)和追加模式(a)時,會創(chuàng)建一個新的空文件,然后向文件中寫入或追加指定字符內(nèi)容。現(xiàn)在可以實現(xiàn)字符的追加了,如果想被追加的字符串換一換加入,又該怎么處理呢?在Python中,可以用n字符表示換行,在文本追加時,可以在追加的文本前面加上n字符實現(xiàn)換行。在實際項目應(yīng)用中,文件的讀取和寫入操作是非常普遍的操作,但凡涉及文件的

15、操作,都離不開文件的讀取或?qū)懭搿5?5頁,共35頁。12.2.2 行的讀寫目前對文件的讀操作是按字節(jié)讀或整個讀取,而寫操作是全部覆寫或追加,這樣的操作在實際應(yīng)用中很不實用。Python中提供了readline()、readlines()和writelines()等方法用于實現(xiàn)對行的操作。示例如下(file_read_write.py):path=./test.txtf_name=open(path, w)f_name.write(Hello world!n)f_name=open(path, a)f_name.write(welcome!)f_name=open(path,r)print(fr

16、eadline result:f_name.readline()第16頁,共35頁。執(zhí)行結(jié)果為:readline result: Hello world!readline方法會從文件中讀取單獨的一行。換行符為 n。readline方法如果返回一個空字符串, 說明已經(jīng)讀取到最后一行。readline方法也可以像read方法那樣傳入數(shù)值來讀取對應(yīng)的字符數(shù),傳入小于0的表示整行都輸出。readlines方法和readline方法類似,當(dāng)傳入數(shù)值小于等于列表中一個字符串的長度值時,該字符串都會被讀?。粋魅胄∮诘扔?的數(shù)值,所有字符都被讀取。writelines方法和readlines方法相反,傳給它一

17、個字符串的列表(任何序列或可迭代的對象),它會把所有的字符串寫入文件。如果沒有writeline()方法,就可以使用write()方法代替這個方法的功能。在實際項目應(yīng)用中,若能用行的方式讀取或?qū)懭胛募ㄗh使用行的方式,按行讀取或?qū)懭氲姆绞叫时容^高。第17頁,共35頁。12.2.3 正確關(guān)閉文件在讀取或?qū)懭胛募倪^程中,出現(xiàn)異常的概率是比較高的,特別對于大型文件的讀取和寫入,出現(xiàn)異常更是家常便飯。在讀取或?qū)懭胛募倪^程中,對文件的操作出現(xiàn)異常該怎么處理呢?這需要用到前面介紹的異常的知識,用try語句捕獲可能出現(xiàn)的異常。在捕獲異常前有一個動作要執(zhí)行,就是調(diào)用文件的close()方法關(guān)閉文件。一

18、般情況下,一個文件對象在退出程序后會自動關(guān)閉,但是為了安全起見,還是要顯式地寫一個close()方法關(guān)閉文件。顯式關(guān)閉文件讀取或?qū)懭氲牟僮魅缦拢╢ile_close.py):path=./test.txtf_name=open(path, w)print(fwrite length:f_name.write(Hello world!)f_name.close()第18頁,共35頁。對文件內(nèi)容更改過的文件一定要記得關(guān)閉,寫入的數(shù)據(jù)可能被緩存,如果系統(tǒng)因為某些原因崩潰了,被緩存部分?jǐn)?shù)據(jù)就不會寫入文件。為了安全起見,在使用完文件后一定要記得關(guān)閉。當(dāng)使用了try語句時,有異常時,即使使用了close方

19、法,也可能不被執(zhí)行,可將close方法放在finally子句中執(zhí)行,就可以保證會調(diào)用close方法。前面的示例可以更改成如下更安全的形式(file_safe_close.py):path=./test.txttry: f_name=open(path, w) print(fwrite length:f_name.write(Hello world!)finally: if f_name: f_name.close()第19頁,共35頁。每次都要這么寫,會感覺很繁瑣,Python中引入了with語句來自動幫我們調(diào)用close方法??梢允褂脀ith語句將上面的程序更改如下(file_safer_c

20、lose.py):path=./test.txtwith open(path, w) as f: print(fwrite length:f.write(Hello world!)這段代碼和上面使用try/finally的效果是一樣的,并且會自動調(diào)用close方法。第20頁,共35頁。12.2.4 rename()方法在Python中,os模塊中有一個rename()方法用于文件重命名。使用rename()方法需要通過import語句導(dǎo)入os模塊。rename()方法的語法格式如下:os.rename(current_file_name, new_file_name)語法中,os為導(dǎo)入的os模

21、塊,current_file_name為當(dāng)前文件名,new_file_name為新文件名。若文件不在當(dāng)前目錄下,則文件名需要帶上絕對路徑。rename()方法沒有返回值。rename()方法的使用示例如下(file_rename.py):import osopen(./test1.txt, w)os.rename(test1.txt,test2.txt)第21頁,共35頁。執(zhí)行上面的代碼后,輸出結(jié)果可以到對應(yīng)目錄下查看,若之前已經(jīng)創(chuàng)建了一個名為test1.txt的文件,則執(zhí)行程序后,文件名會更改為test2.txt。若之前沒有創(chuàng)建test1.txt文件,則執(zhí)行程序后,會先創(chuàng)建一個名為test1

22、.txt的文件,然后將文件名更改為test2.txt。在實際項目應(yīng)用中,rename()方法是一個比較有用的方法,特別是在涉及大批量文件的重命名時,它可以非??焖俚貙崿F(xiàn)文件的重命名。第22頁,共35頁。12.2.5 remove()方法在Python中,os模塊中提供了一個remove()方法用于刪除文件。使用remove()方法需要導(dǎo)入os模塊。remove()方法的語法格式如下:os.remove(file_name)語法中,os為導(dǎo)入的os模塊,file_name為需要刪除的文件名。若待刪除文件不在當(dāng)前目錄下,則文件名需要使用絕對路徑,否則執(zhí)行remove()方法時會拋異常。remove

23、()方法沒有返回值。remove()方法的使用示例見書本或file_remove.py文件。在實際項目應(yīng)用中,remove()方法的使用不多,但比較有用,經(jīng)常會使用remove()方法來刪除臨時文件或過期文件。第23頁,共35頁。12.3 文件內(nèi)容的迭代前面介紹了文件的基本操作方法。在實際應(yīng)用中,對文件內(nèi)容的操作,更多的是做迭代或重復(fù)執(zhí)行的操作。所謂迭代,是指不斷重復(fù)某一個動作,直到這些動作都完成為止。對文件的迭代操作,一般都會使用while循環(huán),在while循環(huán)語句中使用read()或readline()方法讀取文件內(nèi)容。在while循環(huán)中,read()方法是最常見的對文件內(nèi)容進(jìn)行迭代的方法

24、。代碼示例見書本或file_read_byte.py文件。第24頁,共35頁。在實際操作中,處理文件時可能需要對文件的行(而不是單個字符)進(jìn)行迭代,對行的迭代,可以在while循環(huán)語句中使用readline()方法。在實際項目應(yīng)用中,在對文件的操作中,讀取文件時,必然要涉及文件內(nèi)容的迭代。第25頁,共35頁。12.4 序列化與反序列化在運行程序的過程中,所有變量都被存放在內(nèi)存中,把變量從內(nèi)存中變成可存儲或傳輸?shù)倪^程稱為序列化??梢园研蛄谢蟮膬?nèi)容寫入磁盤,或者通過網(wǎng)絡(luò)傳輸?shù)絼e的機(jī)器上。反過來,把變量內(nèi)容從序列化的對象重新讀到內(nèi)存中的過程稱為反序列化。序列化是指將數(shù)據(jù)結(jié)構(gòu)或?qū)ο筠D(zhuǎn)換成二進(jìn)制串的過

25、程。反序列化是指將序列化過程中生成的二進(jìn)制串轉(zhuǎn)換成數(shù)據(jù)結(jié)構(gòu)或?qū)ο蟮倪^程。第26頁,共35頁。12.4.1 pickle模塊實現(xiàn)列化與反序列化在Python中,基本數(shù)據(jù)的序列化和反序列化通過pickle模塊實現(xiàn)。通過pickle模塊的序列化操作,能夠?qū)⒊绦蛑羞\行的對象信息保存到文件中,從而永久 存儲。而通過pickle模塊的反序列化操作,能夠從文件中創(chuàng)建上一次程序保存的對象。pickle模塊的基本接口如下:pickle.dump(obj, file, ,protocol)代碼示例見書本或file_pickle.py文件。第27頁,共35頁。若已經(jīng)將內(nèi)容序列化到文件中,使用文件時需要把對象從磁盤讀到內(nèi)存。使用時,可以先把文本內(nèi)容讀到一個bytes,然后用pickle.loads()方法反序列化對象;也可以直接用pickle.load()方法從一個文件對象中直接反序列化對象。需要注意的是,pickle的序列化和反序列化只能用于Python,不同版本的Python可能彼此都不兼容,因此pickle一般用于保存不重要的數(shù)據(jù),也就是不能成功反序列化也沒關(guān)系的數(shù)據(jù)。第28頁,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論