Python基本文件操作實(shí)用指南
一、前言
在Python中,內(nèi)置了文件(File)對象。在使用文件對象時(shí),首先需要通過內(nèi)置的open()方法創(chuàng)建一個文件對象,然后通過該對象提供的方法進(jìn)行一些基本文件操作。例如,可以使用文件對象的write()方法向文件中寫入內(nèi)容,以及使用close()方法關(guān)閉文件等。下面將介紹如何應(yīng)用Python的文件對象進(jìn)行基本文件操作。
二、創(chuàng)建和打開文件
在Python中,想要操作文件需要先創(chuàng)建或者打開指定的文件并創(chuàng)建文件對象。這可以通過內(nèi)置的open()函數(shù)實(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 | 以二進(jìn)制格式打開文件,并采取只讀模式。文件的指針將會放在文件的開頭。一般用于非文本文件,如照片、音樂等。 |
| r+ | 打開文件后,可以讀取文件內(nèi)容,也可以寫入新的內(nèi)容覆蓋原有內(nèi)容(從文件開頭進(jìn)行覆蓋) |
| rb+ | 以二進(jìn)制格式打開文件,并采取寫模式。文件的指針將會放在文件的開頭。一般用于非文本文件,如圖片、聲音等。 |
| w | 以只寫模式打開文件 |
| wb | 以二進(jìn)制格式打開文件,并且采用只寫模式。一般用于非文本文件,如圖片、聲音等 |
| w+ | 打開文件后,先清空原有內(nèi)容,使其變?yōu)橐粋€空的文件,對這個空文件有讀寫權(quán)限 |
| wb+ | 以二進(jìn)制格式打開文件,并且采用讀寫模式。一般用于非文本文件,如圖片、聲音等 |
| a | 以追加模式打開一個文件。如果該文件已經(jīng)存在,文件指針將放在文件的末尾(即新內(nèi)容會被寫入到已有內(nèi)容之后),否則,創(chuàng)建新文件用于寫入 |
| ab | 以二進(jìn)制格式打開一個文件,并采用追加模式。如果該文件已存在,文件指針將會放在文件的結(jié)尾(即新內(nèi)容會被寫入到已有內(nèi)容之后),否則,創(chuàng)建新文件用于寫入 |
| a+ | 已讀寫模式打開文件。如果該文件已經(jīng)存在,文件指針將放在文件的末尾(即新內(nèi)容會被寫入到已有內(nèi)容之后),否則,創(chuàng)建新文件用于寫入 |
| ab+ | 以二進(jìn)制格式打開一個文件,并采用追加模式。如果該文件已經(jīng)存在,文件指針將會放在文件的結(jié)尾(即新內(nèi)容會被寫入到已有內(nèi)容之后),否則,創(chuàng)建新文件用于寫入 |
1.打開一個不存在的文件時(shí)先創(chuàng)建該文件
在默認(rèn)的情況下,使用open()函數(shù)打開一個不存在的文件,會拋出如圖所示的異常。

要解決上圖所示的錯誤,主要有以下兩種方法:
- 在當(dāng)前目錄下(即與執(zhí)行的文件相同的目錄)創(chuàng)建一個名稱為 status.txt 的文件。
- 在調(diào)用open()函數(shù)時(shí),指定mode的參數(shù)值為w、w+、a、a+。這樣,當(dāng)要打開的文件不存在時(shí),就可以創(chuàng)建新的文件了。
2.以二進(jìn)制形式打開文件
使用open()函數(shù)不僅可以文本的形式打開文本文件,而且可以以二進(jìn)制形式打開非文本文件,如圖片、音頻文件等。例如,創(chuàng)建一個名稱為picture.jpg的圖片文件(如圖所示),并且應(yīng)用open()函數(shù)以二進(jìn)制方式打開該文件。

以二進(jìn)制方式打開該文件,并輸出創(chuàng)建的對象對的代碼如下:
file = open("picture.jpg", "rb")
print(file)
執(zhí)行上面代碼,將顯示如圖所示的結(jié)果:

從上圖中可看出,創(chuàng)建的是一個BufferedReader對象。對于該對象生成后,可以再應(yīng)用其他的第三方模塊進(jìn)行處理。例如,上面的BufferedReader對象是通過打開圖片文件實(shí)現(xiàn)的。那么就可以將其傳入到第三期的圖像處理庫PIL的Image模塊的open()方法中,以便于對圖像進(jìn)行處理(如調(diào)整大小等)
3.打開文件時(shí)指定編碼方式
在使用open()函數(shù)打開文件時(shí),默認(rèn)采用GBK編碼,當(dāng)被打開的文件不是GBK編碼時(shí),將拋出異常,如圖所示:

解決該問題的方法有兩種,一種直接修改文件的編碼,另外一種是在打開文件時(shí),直接指定使用的編碼方式。推薦采用后一種方法。下面重點(diǎn)介紹如何在打開文件時(shí)指定編碼方式。
在調(diào)用open()函數(shù)時(shí),通過添加“encoding=‘utf-8’”參數(shù)即可實(shí)現(xiàn)編碼指定為UTF-8。如果想指定其他編碼可以將單引號中的內(nèi)容替換為想要指定的編碼即可。
例如,打開采用UTF-8編碼保存的notice.txt文件,可以使用下面的代碼:
file = open("notice.txt", "r", encoding='utf-8')
三、關(guān)閉文件
打開文件后,需要及時(shí)關(guān)閉,以免對文件造成不必要的破壞。關(guān)閉文件可以使用文件對象close()方法實(shí)現(xiàn)。close()方法的語法格式如下:
file.close() # 關(guān)閉文件
說明: close()方法先刷新緩沖區(qū)中還沒寫入的信息,然后再關(guān)閉文件,這樣可以將沒有寫入到文件的內(nèi)容寫入到文件中。在關(guān)閉文件后,便不能再進(jìn)行寫入操作了。
四、打開文件時(shí)使用with語句
打開文件后,要及時(shí)將其關(guān)閉,如果忘記關(guān)閉可能會帶來意想不到的問題。另外如果在打開文件時(shí)拋出異常,那么將導(dǎo)致文件不能及時(shí)關(guān)閉。為了更好地避免此類事情的發(fā)生,可以使用Python提供with語句。從而實(shí)現(xiàn)在處理文件時(shí),無論是否拋出異常,都能保障with語句執(zhí)行完畢后關(guān)閉已經(jīng)打開的文件。with語句的基本語法格式如下:
with expression as target: with-body
參數(shù)說明:
expression :用于指定一個表達(dá)式,這里可以是打開文件的函數(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)容的前提是,打開文件時(shí),指定的打開模式為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)容的前提是,打開文件時(shí),指定的模式為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的強(qiáng)度,強(qiáng)度到你無法想象!??!
那么執(zhí)行以上代碼,將顯示以下內(nèi)容:

使用read([size])方法讀取文件時(shí),是從文件的開頭讀取部分內(nèi)容,可以先使用文件對象的seek()方法將文件的指針移動到新的位置,然后在應(yīng)用read([size])方法讀取,seek()方法基本語法如下:
file.seek(offset[,whence])
參數(shù)說明:
- file:表示已經(jīng)打開的文件對象。
- offset:用于指定移動的字符個數(shù),其具體位置與whence有關(guān)。
- whence:用于指定從什么位置開始計(jì)算。值為0表示從文件頭開始計(jì)算,值為1表示從當(dāng)前位置計(jì)算,值為2表示從文件尾開始計(jì)算,默認(rèn)為0。
注意: 對于 whence參數(shù),如果在打開文件時(shí),沒有使用b模式(即rb),那么只允許從文件頭開始計(jì)算相對位置,從文件尾計(jì)算時(shí)就會引發(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()方法時(shí),offset的值是按照一個漢字占兩個字符、英文和數(shù)字點(diǎn)占一個字符計(jì)算的,這個與read(size)方法不同。
2.讀取一行
在使用read()方法讀取文件時(shí),如果文件很大,一次讀取完全部內(nèi)容到內(nèi)存,容易造成年內(nèi)存不足,所以采取逐行讀取。文件對象提供了readline()方法用于每次讀取一行數(shù)據(jù)。readline()方法的語法格式如下:
file.readline()
其中,file為打開的文件對象,同read()方法一樣,打開文件時(shí),指定的模式為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()方法時(shí)不指定size類似,只不過讀取全部行時(shí),返回的是一個字符串列表,每個元素為文件的一行內(nèi)容。讀取全部行,使用的是文件對象的readlines()方法,其語法格式如下:
file.readlines()
其中,file為打開的文件對象,同read()方法一樣,打開文件時(shí),指定的模式為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)容:

從該運(yùn)行結(jié)果中可以看出readlines()方法的返回值為一個字符串列表。在這個字符串列表中,每個元素為一行內(nèi)容。如果文件較大時(shí),采用這種方法輸出讀取的文件內(nèi)容會很慢。這時(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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
修復(fù) Django migration 時(shí)遇到的問題解決
本篇文章主要介紹了修復(fù) Django migration 時(shí)遇到的問題解決,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-06-06
Python實(shí)現(xiàn)電腦壁紙的采集與輪換效果
這篇文章主要為大家介紹了如何利用Python實(shí)現(xiàn)電腦壁紙的采集以及輪換效果,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Python有一定幫助,需要的可以參考一下2022-04-04
pandas預(yù)處理部分地區(qū)數(shù)據(jù)案例
本文主要介紹了pandas預(yù)處理部分地區(qū)數(shù)據(jù)案例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01
Python中實(shí)現(xiàn)地圖可視化的方法小結(jié)
Python提供了多個強(qiáng)大的庫,如Folium、Matplotlib、Geopandas等,使得創(chuàng)建漂亮而具有信息量的地圖變得簡單而靈活,本文將詳細(xì)介紹如何使用這些庫繪制漂亮的地圖,感興趣的可以了解下2023-12-12
python pytorch中.view()函數(shù)的用法解讀
這篇文章主要介紹了python pytorch中.view()函數(shù)的用法,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08




