Python基本文件操作實(shí)用指南
一、前言
在Python中,內(nèi)置了文件(File)對(duì)象。在使用文件對(duì)象時(shí),首先需要通過(guò)內(nèi)置的open()方法創(chuàng)建一個(gè)文件對(duì)象,然后通過(guò)該對(duì)象提供的方法進(jìn)行一些基本文件操作。例如,可以使用文件對(duì)象的write()方法向文件中寫(xiě)入內(nèi)容,以及使用close()方法關(guān)閉文件等。下面將介紹如何應(yīng)用Python的文件對(duì)象進(jìn)行基本文件操作。
二、創(chuàng)建和打開(kāi)文件
在Python中,想要操作文件需要先創(chuàng)建或者打開(kāi)指定的文件并創(chuàng)建文件對(duì)象。這可以通過(guò)內(nèi)置的open()函數(shù)實(shí)現(xiàn)。open()函數(shù)的基本語(yǔ)法格式如下:
file = open(filename[,mode[,buffering]])
參數(shù)說(shuō)明:
- file:被創(chuàng)建的文件對(duì)象
- filename:要?jiǎng)?chuàng)建或打開(kāi)文件的文件名稱(chēng),需要使用單引號(hào)或雙引號(hào)括起來(lái)。如果要打開(kāi)的文件和當(dāng)前文件在同一個(gè)目錄下,那么直接寫(xiě)文件名即可,否則需要指定完整路徑。例如,要打開(kāi)當(dāng)前路徑下的名稱(chēng)為status.txt的文件,可以使用“status.txt”。
- mode:可選參數(shù),用于指定文件的打開(kāi)模式。其參數(shù)值如下面所示。默認(rèn)打開(kāi)模式為只讀(即r)
值 | 說(shuō)明 |
---|---|
r | 以只讀方式打開(kāi)文件。文件的指針將會(huì)放在文件的開(kāi)頭。 |
rb | 以二進(jìn)制格式打開(kāi)文件,并采取只讀模式。文件的指針將會(huì)放在文件的開(kāi)頭。一般用于非文本文件,如照片、音樂(lè)等。 |
r+ | 打開(kāi)文件后,可以讀取文件內(nèi)容,也可以寫(xiě)入新的內(nèi)容覆蓋原有內(nèi)容(從文件開(kāi)頭進(jìn)行覆蓋) |
rb+ | 以二進(jìn)制格式打開(kāi)文件,并采取寫(xiě)模式。文件的指針將會(huì)放在文件的開(kāi)頭。一般用于非文本文件,如圖片、聲音等。 |
w | 以只寫(xiě)模式打開(kāi)文件 |
wb | 以二進(jìn)制格式打開(kāi)文件,并且采用只寫(xiě)模式。一般用于非文本文件,如圖片、聲音等 |
w+ | 打開(kāi)文件后,先清空原有內(nèi)容,使其變?yōu)橐粋€(gè)空的文件,對(duì)這個(gè)空文件有讀寫(xiě)權(quán)限 |
wb+ | 以二進(jìn)制格式打開(kāi)文件,并且采用讀寫(xiě)模式。一般用于非文本文件,如圖片、聲音等 |
a | 以追加模式打開(kāi)一個(gè)文件。如果該文件已經(jīng)存在,文件指針將放在文件的末尾(即新內(nèi)容會(huì)被寫(xiě)入到已有內(nèi)容之后),否則,創(chuàng)建新文件用于寫(xiě)入 |
ab | 以二進(jìn)制格式打開(kāi)一個(gè)文件,并采用追加模式。如果該文件已存在,文件指針將會(huì)放在文件的結(jié)尾(即新內(nèi)容會(huì)被寫(xiě)入到已有內(nèi)容之后),否則,創(chuàng)建新文件用于寫(xiě)入 |
a+ | 已讀寫(xiě)模式打開(kāi)文件。如果該文件已經(jīng)存在,文件指針將放在文件的末尾(即新內(nèi)容會(huì)被寫(xiě)入到已有內(nèi)容之后),否則,創(chuàng)建新文件用于寫(xiě)入 |
ab+ | 以二進(jìn)制格式打開(kāi)一個(gè)文件,并采用追加模式。如果該文件已經(jīng)存在,文件指針將會(huì)放在文件的結(jié)尾(即新內(nèi)容會(huì)被寫(xiě)入到已有內(nèi)容之后),否則,創(chuàng)建新文件用于寫(xiě)入 |
1.打開(kāi)一個(gè)不存在的文件時(shí)先創(chuàng)建該文件
在默認(rèn)的情況下,使用open()函數(shù)打開(kāi)一個(gè)不存在的文件,會(huì)拋出如圖所示的異常。
要解決上圖所示的錯(cuò)誤,主要有以下兩種方法:
- 在當(dāng)前目錄下(即與執(zhí)行的文件相同的目錄)創(chuàng)建一個(gè)名稱(chēng)為 status.txt 的文件。
- 在調(diào)用open()函數(shù)時(shí),指定mode的參數(shù)值為w、w+、a、a+。這樣,當(dāng)要打開(kāi)的文件不存在時(shí),就可以創(chuàng)建新的文件了。
2.以二進(jìn)制形式打開(kāi)文件
使用open()函數(shù)不僅可以文本的形式打開(kāi)文本文件,而且可以以二進(jìn)制形式打開(kāi)非文本文件,如圖片、音頻文件等。例如,創(chuàng)建一個(gè)名稱(chēng)為picture.jpg的圖片文件(如圖所示),并且應(yīng)用open()函數(shù)以二進(jìn)制方式打開(kāi)該文件。
以二進(jìn)制方式打開(kāi)該文件,并輸出創(chuàng)建的對(duì)象對(duì)的代碼如下:
file = open("picture.jpg", "rb") print(file)
執(zhí)行上面代碼,將顯示如圖所示的結(jié)果:
從上圖中可看出,創(chuàng)建的是一個(gè)BufferedReader對(duì)象。對(duì)于該對(duì)象生成后,可以再應(yīng)用其他的第三方模塊進(jìn)行處理。例如,上面的BufferedReader對(duì)象是通過(guò)打開(kāi)圖片文件實(shí)現(xiàn)的。那么就可以將其傳入到第三期的圖像處理庫(kù)PIL的Image模塊的open()方法中,以便于對(duì)圖像進(jìn)行處理(如調(diào)整大小等)
3.打開(kāi)文件時(shí)指定編碼方式
在使用open()函數(shù)打開(kāi)文件時(shí),默認(rèn)采用GBK編碼,當(dāng)被打開(kāi)的文件不是GBK編碼時(shí),將拋出異常,如圖所示:
解決該問(wèn)題的方法有兩種,一種直接修改文件的編碼,另外一種是在打開(kāi)文件時(shí),直接指定使用的編碼方式。推薦采用后一種方法。下面重點(diǎn)介紹如何在打開(kāi)文件時(shí)指定編碼方式。
在調(diào)用open()函數(shù)時(shí),通過(guò)添加“encoding=‘utf-8’”參數(shù)即可實(shí)現(xiàn)編碼指定為UTF-8。如果想指定其他編碼可以將單引號(hào)中的內(nèi)容替換為想要指定的編碼即可。
例如,打開(kāi)采用UTF-8編碼保存的notice.txt文件,可以使用下面的代碼:
file = open("notice.txt", "r", encoding='utf-8')
三、關(guān)閉文件
打開(kāi)文件后,需要及時(shí)關(guān)閉,以免對(duì)文件造成不必要的破壞。關(guān)閉文件可以使用文件對(duì)象close()方法實(shí)現(xiàn)。close()方法的語(yǔ)法格式如下:
file.close() # 關(guān)閉文件
說(shuō)明: close()方法先刷新緩沖區(qū)中還沒(méi)寫(xiě)入的信息,然后再關(guān)閉文件,這樣可以將沒(méi)有寫(xiě)入到文件的內(nèi)容寫(xiě)入到文件中。在關(guān)閉文件后,便不能再進(jìn)行寫(xiě)入操作了。
四、打開(kāi)文件時(shí)使用with語(yǔ)句
打開(kāi)文件后,要及時(shí)將其關(guān)閉,如果忘記關(guān)閉可能會(huì)帶來(lái)意想不到的問(wèn)題。另外如果在打開(kāi)文件時(shí)拋出異常,那么將導(dǎo)致文件不能及時(shí)關(guān)閉。為了更好地避免此類(lèi)事情的發(fā)生,可以使用Python提供with語(yǔ)句。從而實(shí)現(xiàn)在處理文件時(shí),無(wú)論是否拋出異常,都能保障with語(yǔ)句執(zhí)行完畢后關(guān)閉已經(jīng)打開(kāi)的文件。with語(yǔ)句的基本語(yǔ)法格式如下:
with expression as target: with-body
參數(shù)說(shuō)明:
expression :用于指定一個(gè)表達(dá)式,這里可以是打開(kāi)文件的函數(shù)open()。
target:用于指定一個(gè)變量,并且將expression 的結(jié)果保存到這個(gè)變量中。
with-body:用于指定with語(yǔ)句體,其中可以是執(zhí)行with語(yǔ)句相關(guān)聯(lián)的一些操作語(yǔ)句。如果不想執(zhí)行語(yǔ)句,可以直接使用pass語(yǔ)句來(lái)代替。
例如打開(kāi)文件的語(yǔ)句,修改后的代碼如下:
print("\n", "=" * 10, "Python經(jīng)典應(yīng)用", "=" * 10) with open("massage.txt", "w") as file: # 創(chuàng)建或打開(kāi)保存Python經(jīng)典應(yīng)用信息的文件 pass print("\n 即將顯示……\n")
五、寫(xiě)入文件內(nèi)容
在前面的內(nèi)容中,雖然創(chuàng)建并打開(kāi)了一個(gè)文件,但是該文件中并沒(méi)有任何內(nèi)容,它的大小是0kb。Python中的文件對(duì)象提供了write()方法,可以像文件中寫(xiě)入內(nèi)容。write()方法的語(yǔ)法格式如下:
file.write(string)
參數(shù)說(shuō)明:
- file:打開(kāi)的文件對(duì)象
- string:要寫(xiě)入的字符串
注意: 在調(diào)用write()方法向文件寫(xiě)入內(nèi)容的前提是,打開(kāi)文件時(shí),指定的打開(kāi)模式為w(可寫(xiě))或者a(追加),否則,將拋出如圖所示的異常:
六、讀取文件
在Python中打開(kāi)文件后,除了可以向其寫(xiě)入或追加內(nèi)容,還可以讀取文件中的內(nèi)容。讀取文件內(nèi)容主要分為以下幾種情況。
1.讀取指定字符
文件對(duì)象提供了read()方法讀取指定個(gè)數(shù)的字符,其語(yǔ)法格式如下:
file.read([size])
參數(shù)說(shuō)明:
- file:打開(kāi)的文件對(duì)象
- size:可選參數(shù),用于指定要讀取的字符個(gè)數(shù),如果省略則一次性讀取所有內(nèi)容。
注意: 在調(diào)用read()方法讀取文件內(nèi)容的前提是,打開(kāi)文件時(shí),指定的模式為r(只讀)或者r+(讀寫(xiě)),否則,將拋出如圖所示的異常。
例如,讀取massage.txt中的前9字符串,可以使用下列代碼:
with open("massage.txt", "r", encoding='utf-8') as file: # 打開(kāi)文件 string = file.read(9) # 讀取前9字符串 print(string)
例如,massage.txt文件的內(nèi)容為:
Python的強(qiáng)度,強(qiáng)度到你無(wú)法想象?。。?
那么執(zhí)行以上代碼,將顯示以下內(nèi)容:
使用read([size])方法讀取文件時(shí),是從文件的開(kāi)頭讀取部分內(nèi)容,可以先使用文件對(duì)象的seek()方法將文件的指針移動(dòng)到新的位置,然后在應(yīng)用read([size])方法讀取,seek()方法基本語(yǔ)法如下:
file.seek(offset[,whence])
參數(shù)說(shuō)明:
- file:表示已經(jīng)打開(kāi)的文件對(duì)象。
- offset:用于指定移動(dòng)的字符個(gè)數(shù),其具體位置與whence有關(guān)。
- whence:用于指定從什么位置開(kāi)始計(jì)算。值為0表示從文件頭開(kāi)始計(jì)算,值為1表示從當(dāng)前位置計(jì)算,值為2表示從文件尾開(kāi)始計(jì)算,默認(rèn)為0。
注意: 對(duì)于 whence參數(shù),如果在打開(kāi)文件時(shí),沒(méi)有使用b模式(即rb),那么只允許從文件頭開(kāi)始計(jì)算相對(duì)位置,從文件尾計(jì)算時(shí)就會(huì)引發(fā)如圖所示的異常:
例如,想要從文件的第6個(gè)字符開(kāi)始讀取2個(gè)字符,可以使用下列代碼:
with open("message.txt", "r") as file: # 打開(kāi)文件 file.seek(5) # 移動(dòng)指針到新的位置 string = file.read(2) # 讀取2個(gè)字符 print(string)
如果message.txt文件中內(nèi)容為:
123456789
那么執(zhí)行上面代碼,將顯示以下結(jié)果:
說(shuō)明: 在使用seek()方法時(shí),offset的值是按照一個(gè)漢字占兩個(gè)字符、英文和數(shù)字點(diǎn)占一個(gè)字符計(jì)算的,這個(gè)與read(size)方法不同。
2.讀取一行
在使用read()方法讀取文件時(shí),如果文件很大,一次讀取完全部?jī)?nèi)容到內(nèi)存,容易造成年內(nèi)存不足,所以采取逐行讀取。文件對(duì)象提供了readline()方法用于每次讀取一行數(shù)據(jù)。readline()方法的語(yǔ)法格式如下:
file.readline()
其中,file為打開(kāi)的文件對(duì)象,同read()方法一樣,打開(kāi)文件時(shí),指定的模式為r(只讀)或者r+(讀寫(xiě))。
print("\n", "=" * 20, "Python經(jīng)典應(yīng)用", "=" * 20) with open("message.txt", "r", encoding="utf-8") as file: number = 0 # 記錄行號(hào) while True: number += 1 line = file.readline() if line == "": break print(number, line, end="\n") print("\n ", "=" * 20, "over" * 20, "\n")
如果message.txt文件中內(nèi)容為下圖所示:
執(zhí)行上面代碼,將顯示以下內(nèi)容:
3.讀取全部行
讀取全部行的作用同調(diào)用read()方法時(shí)不指定size類(lèi)似,只不過(guò)讀取全部行時(shí),返回的是一個(gè)字符串列表,每個(gè)元素為文件的一行內(nèi)容。讀取全部行,使用的是文件對(duì)象的readlines()方法,其語(yǔ)法格式如下:
file.readlines()
其中,file為打開(kāi)的文件對(duì)象,同read()方法一樣,打開(kāi)文件時(shí),指定的模式為r(只讀)或者r+(讀寫(xiě))。
例如,通過(guò)readlines()方法讀取message.txt文件中所有內(nèi)容,并輸出讀取內(nèi)容結(jié)果,代碼如下:
print("\n", "=" * 20, "Python經(jīng)典應(yīng)用", "=" * 20) with open("message.txt", "r", encoding="utf-8") as file: message = file.readlines() # 讀取全部信息 print(message) print("\n ", "=" * 20, "over", "=" * 20, "\n")
執(zhí)行上面代碼,將顯示以下內(nèi)容:
從該運(yùn)行結(jié)果中可以看出readlines()方法的返回值為一個(gè)字符串列表。在這個(gè)字符串列表中,每個(gè)元素為一行內(nèi)容。如果文件較大時(shí),采用這種方法輸出讀取的文件內(nèi)容會(huì)很慢。這時(shí)可以將列表的內(nèi)容逐行輸出,例如,代碼可以修改為以下內(nèi)容:
print("\n", "=" * 20, "Python經(jīng)典應(yīng)用", "=" * 20) with open("message.txt", "r", encoding="utf-8") as file: messageall = file.readlines() # 讀取全部信息 for message in messageall: print(message) # 輸出一條信息 print("\n ", "=" * 20, "over", "=" * 20, "\n")
執(zhí)行上面代碼,將顯示以下內(nèi)容:
總結(jié)
到此這篇關(guān)于Python基本文件操作實(shí)用指南的文章就介紹到這了,更多相關(guān)Python文件操作內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python實(shí)現(xiàn)將元祖轉(zhuǎn)換成數(shù)組的方法
這篇文章主要介紹了python實(shí)現(xiàn)將元祖轉(zhuǎn)換成數(shù)組的方法,涉及Python中l(wèi)ist方法的使用技巧,需要的朋友可以參考下2015-05-05tensorflow實(shí)現(xiàn)加載mnist數(shù)據(jù)集
這篇文章主要為大家詳細(xì)介紹了tensorflow實(shí)現(xiàn)加載mnist數(shù)據(jù)集,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-09-09python實(shí)現(xiàn)對(duì)象列表根據(jù)某個(gè)屬性排序的方法詳解
這篇文章主要介紹了python實(shí)現(xiàn)對(duì)象列表根據(jù)某個(gè)屬性排序的方法,結(jié)合具體實(shí)例形式詳細(xì)分析了Python對(duì)象列表遍歷、排序的兩種常見(jiàn)操作技巧,需要的朋友可以參考下2019-06-06詳解多線程Django程序耗盡數(shù)據(jù)庫(kù)連接的問(wèn)題
這篇文章主要介紹了多線程Django程序耗盡數(shù)據(jù)庫(kù)連接的問(wèn)題,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-10-10淺談Python使用pickle模塊序列化數(shù)據(jù)優(yōu)化代碼的方法
這篇文章主要介紹了淺談Python使用pickle模塊序列化數(shù)據(jù)優(yōu)化代碼的方法,pickle模塊可以對(duì)多種Python對(duì)象進(jìn)行序列化和反序列化,序列化稱(chēng)為pickling,反序列化稱(chēng)為unpickling,需要的朋友可以參考下2023-07-07