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