首頁 > 軟體

Python基本檔案操作實用指南

2022-06-08 22:01:31

一、前言

在Python中,內建了檔案(File)物件。在使用檔案物件時,首先需要通過內建的open()方法建立一個檔案物件,然後通過該物件提供的方法進行一些基本檔案操作。例如,可以使用檔案物件的write()方法向檔案中寫入內容,以及使用close()方法關閉檔案等。下面將介紹如何應用Python的檔案物件進行基本檔案操作。

二、建立和開啟檔案

在Python中,想要操作檔案需要先建立或者開啟指定的檔案並建立檔案物件。這可以通過內建的open()函數實現。open()函數的基本語法格式如下:

file = open(filename[,mode[,buffering]])

引數說明:

  • file:被建立的檔案物件
  • filename:要建立或開啟檔案的檔名稱,需要使用單引號或雙引號括起來。如果要開啟的檔案和當前檔案在同一個目錄下,那麼直接寫檔名即可,否則需要指定完整路徑。例如,要開啟當前路徑下的名稱為status.txt的檔案,可以使用“status.txt”。
  • mode:可選引數,用於指定檔案的開啟模式。其引數值如下面所示。預設開啟模式為唯讀(即r)
說明
r以唯讀方式開啟檔案。檔案的指標將會放在檔案的開頭。
rb以二進位制格式開啟檔案,並採取唯讀模式。檔案的指標將會放在檔案的開頭。一般用於非文字檔案,如照片、音樂等。
r+開啟檔案後,可以讀取檔案內容,也可以寫入新的內容覆蓋原有內容(從檔案開頭進行覆蓋)
rb+以二進位制格式開啟檔案,並採取寫模式。檔案的指標將會放在檔案的開頭。一般用於非文字檔案,如圖片、聲音等。
w以只寫模式開啟檔案
wb以二進位制格式開啟檔案,並且採用只寫模式。一般用於非文字檔案,如圖片、聲音等
w+開啟檔案後,先清空原有內容,使其變為一個空的檔案,對這個空檔案有讀寫許可權
wb+以二進位制格式開啟檔案,並且採用讀寫模式。一般用於非文字檔案,如圖片、聲音等
a以追加模式開啟一個檔案。如果該檔案已經存在,檔案指標將放在檔案的末尾(即新內容會被寫入到已有內容之後),否則,建立新檔案用於寫入
ab以二進位制格式開啟一個檔案,並採用追加模式。如果該檔案已存在,檔案指標將會放在檔案的結尾(即新內容會被寫入到已有內容之後),否則,建立新檔案用於寫入
a+已讀寫模式開啟檔案。如果該檔案已經存在,檔案指標將放在檔案的末尾(即新內容會被寫入到已有內容之後),否則,建立新檔案用於寫入
ab+以二進位制格式開啟一個檔案,並採用追加模式。如果該檔案已經存在,檔案指標將會放在檔案的結尾(即新內容會被寫入到已有內容之後),否則,建立新檔案用於寫入

1.開啟一個不存在的檔案時先建立該檔案

在預設的情況下,使用open()函數開啟一個不存在的檔案,會丟擲如圖所示的異常。

要解決上圖所示的錯誤,主要有以下兩種方法:

  • 在當前目錄下(即與執行的檔案相同的目錄)建立一個名稱為 status.txt 的檔案。
  • 在呼叫open()函數時,指定mode的引數值為w、w+、a、a+。這樣,當要開啟的檔案不存在時,就可以建立新的檔案了。

2.以二進位制形式開啟檔案

使用open()函數不僅可以文字的形式開啟文字檔案,而且可以以二進位制形式開啟非文字檔案,如圖片、音訊檔等。例如,建立一個名稱為picture.jpg的圖片檔案(如圖所示),並且應用open()函數以二進位制方式開啟該檔案。

以二進位制方式開啟該檔案,並輸出建立的物件對的程式碼如下:

file = open("picture.jpg", "rb")
print(file)

執行上面程式碼,將顯示如圖所示的結果:

從上圖中可看出,建立的是一個BufferedReader物件。對於該物件生成後,可以再應用其他的第三方模組進行處理。例如,上面的BufferedReader物件是通過開啟圖片檔案實現的。那麼就可以將其傳入到第三期的影象處理庫PIL的Image模組的open()方法中,以便於對影象進行處理(如調整大小等)

3.開啟檔案時指定編碼方式

在使用open()函數開啟檔案時,預設採用GBK編碼,當被開啟的檔案不是GBK編碼時,將丟擲異常,如圖所示:

解決該問題的方法有兩種,一種直接修改檔案的編碼,另外一種是在開啟檔案時,直接指定使用的編碼方式。推薦採用後一種方法。下面重點介紹如何在開啟檔案時指定編碼方式。

在呼叫open()函數時,通過新增“encoding=‘utf-8’”引數即可實現編碼指定為UTF-8。如果想指定其他編碼可以將單引號中的內容替換為想要指定的編碼即可。

例如,開啟採用UTF-8編碼儲存的notice.txt檔案,可以使用下面的程式碼:

file = open("notice.txt", "r", encoding='utf-8')

三、關閉檔案

開啟檔案後,需要及時關閉,以免對檔案造成不必要的破壞。關閉檔案可以使用檔案物件close()方法實現。close()方法的語法格式如下:

file.close()    # 關閉檔案

說明: close()方法先重新整理緩衝區中還沒寫入的資訊,然後再關閉檔案,這樣可以將沒有寫入到檔案的內容寫入到檔案中。在關閉檔案後,便不能再進行寫入操作了。

四、開啟檔案時使用with語句

開啟檔案後,要及時將其關閉,如果忘記關閉可能會帶來意想不到的問題。另外如果在開啟檔案時丟擲異常,那麼將導致檔案不能及時關閉。為了更好地避免此類事情的發生,可以使用Python提供with語句。從而實現在處理檔案時,無論是否丟擲異常,都能保障with語句執行完畢後關閉已經開啟的檔案。with語句的基本語法格式如下:

with expression as target:
	with-body

引數說明:

expression :用於指定一個表示式,這裡可以是開啟檔案的函數open()。
target:用於指定一個變數,並且將expression 的結果儲存到這個變數中。
with-body:用於指定with語句體,其中可以是執行with語句相關聯的一些操作語句。如果不想執行語句,可以直接使用pass語句來代替。

例如開啟檔案的語句,修改後的程式碼如下:

print("n", "=" * 10, "Python經典應用", "=" * 10)
with open("massage.txt", "w") as file:  # 建立或開啟儲存Python經典應用資訊的檔案
    pass
print("n 即將顯示……n")

五、寫入檔案內容

在前面的內容中,雖然建立並開啟了一個檔案,但是該檔案中並沒有任何內容,它的大小是0kb。Python中的檔案物件提供了write()方法,可以像檔案中寫入內容。write()方法的語法格式如下:

file.write(string)

引數說明:

  • file:開啟的檔案物件
  • string:要寫入的字串

注意: 在呼叫write()方法向檔案寫入內容的前提是,開啟檔案時,指定的開啟模式為w(可寫)或者a(追加),否則,將丟擲如圖所示的異常:

六、讀取檔案

在Python中開啟檔案後,除了可以向其寫入或追加內容,還可以讀取檔案中的內容。讀取檔案內容主要分為以下幾種情況。

1.讀取指定字元

檔案物件提供了read()方法讀取指定個數的字元,其語法格式如下:

file.read([size])

引數說明:

  • file:開啟的檔案物件
  • size:可選引數,用於指定要讀取的字元個數,如果省略則一次性讀取所有內容。

注意: 在呼叫read()方法讀取檔案內容的前提是,開啟檔案時,指定的模式為r(唯讀)或者r+(讀寫),否則,將丟擲如圖所示的異常。

例如,讀取massage.txt中的前9字串,可以使用下列程式碼:

with open("massage.txt", "r", encoding='utf-8') as file:  # 開啟檔案
    string = file.read(9)  # 讀取前9字串
    print(string)

例如,massage.txt檔案的內容為:

Python的強度,強度到你無法想象!!!

那麼執行以上程式碼,將顯示以下內容:

使用read([size])方法讀取檔案時,是從檔案的開頭讀取部分內容,可以先使用檔案物件的seek()方法將檔案的指標移動到新的位置,然後在應用read([size])方法讀取,seek()方法基本語法如下:

file.seek(offset[,whence])

引數說明:

  • file:表示已經開啟的檔案物件。
  • offset:用於指定移動的字元個數,其具體位置與whence有關。
  • whence:用於指定從什麼位置開始計算。值為0表示從檔案頭開始計算,值為1表示從當前位置計算,值為2表示從檔案尾開始計算,預設為0。

注意: 對於 whence引數,如果在開啟檔案時,沒有使用b模式(即rb),那麼只允許從檔案頭開始計算相對位置,從檔案尾計算時就會引發如圖所示的異常:

例如,想要從檔案的第6個字元開始讀取2個字元,可以使用下列程式碼:

with open("message.txt", "r") as file:  # 開啟檔案
    file.seek(5)              # 移動指標到新的位置
    string = file.read(2)	# 讀取2個字元
    print(string)

如果message.txt檔案中內容為:

123456789

那麼執行上面程式碼,將顯示以下結果:

說明: 在使用seek()方法時,offset的值是按照一個漢字佔兩個字元、英文和數位點佔一個字元計算的,這個與read(size)方法不同。

2.讀取一行

在使用read()方法讀取檔案時,如果檔案很大,一次讀取完全部內容到記憶體,容易造成年記憶體不足,所以採取逐行讀取。檔案物件提供了readline()方法用於每次讀取一行資料。readline()方法的語法格式如下:

file.readline()

其中,file為開啟的檔案物件,同read()方法一樣,開啟檔案時,指定的模式為r(唯讀)或者r+(讀寫)。

print("n", "=" * 20, "Python經典應用", "=" * 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檔案中內容為下圖所示:

執行上面程式碼,將顯示以下內容:

3.讀取全部行

讀取全部行的作用同呼叫read()方法時不指定size類似,只不過讀取全部行時,返回的是一個字串列表,每個元素為檔案的一行內容。讀取全部行,使用的是檔案物件的readlines()方法,其語法格式如下:

file.readlines()

其中,file為開啟的檔案物件,同read()方法一樣,開啟檔案時,指定的模式為r(唯讀)或者r+(讀寫)。

例如,通過readlines()方法讀取message.txt檔案中所有內容,並輸出讀取內容結果,程式碼如下:

print("n", "=" * 20, "Python經典應用", "=" * 20)
with open("message.txt", "r", encoding="utf-8") as file:
    message = file.readlines()  # 讀取全部資訊
    print(message)
    print("n ", "=" * 20, "over", "=" * 20, "n")

執行上面程式碼,將顯示以下內容:

從該執行結果中可以看出readlines()方法的返回值為一個字串列表。在這個字串列表中,每個元素為一行內容。如果檔案較大時,採用這種方法輸出讀取的檔案內容會很慢。這時可以將列表的內容逐行輸出,例如,程式碼可以修改為以下內容:

print("n", "=" * 20, "Python經典應用", "=" * 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")

執行上面程式碼,將顯示以下內容:

總結 

到此這篇關於Python基本檔案操作實用指南的文章就介紹到這了,更多相關Python檔案操作內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com