Python中的檔案讀寫-實際操作

fondtiger發表於2021-09-11

Python中的檔案讀寫-實際操作

Python中的檔案讀寫-實際操作

用Python開啟檔案

你需要知道的第一個功能是open()。在Python 2和Python 3中,此命令將返回引數中指定的檔案物件。基本功能用法open()如下:

file_object = open(filename, mode)

在此例項中,filename是您要與之互動的檔案的名稱,包含副檔名。也就是說,如果你有一個文字檔案workData.txt,你的檔名不僅僅是"workData"。是的"workData.txt"。

如果您使用的是Windows,還可以指定檔案所在的確切路徑,例如“C: ThisFolder workData.txt”。

但請記住,字串中的單個反斜槓向Python指示字串文字的開頭。所以這裡有一個問題,因為這兩個含義會發生衝突......

值得慶幸的是,Python有兩種方法可以解決這個問題。第一種是使用雙反斜槓:"C:\ThisFolder\workData.txt"。第二種是使用正斜槓:"C:/ThisFolder/workData.txt"。

open函式中的模式告訴Python你要對檔案做什麼。處理文字檔案時可以指定多種模式。

'w'- 寫入模式:當需要更改檔案並更改或新增資訊時,使用此模式。請記住,這會擦除現有檔案以建立新檔案。檔案指標位於檔案的開頭。

'r'- 讀取模式:當檔案中的資訊僅用於讀取而不以任何方式更改時,使用此模式。檔案指標位於檔案的開頭。

'a'- 附加模式:此模式自動將資訊新增到檔案末尾。檔案指標放在檔案的末尾。

'r+'- 讀/寫模式:當您要更改檔案並從中讀取資訊時使用。檔案指標位於檔案的開頭。

'a+'- 附加和讀取模式:開啟檔案以允許將資料新增到檔案末尾,並讓程式也讀取資訊。檔案指標放在檔案的末尾。

使用二進位制檔案時,將使用相同的模式說明符。但是,您將ab新增到最後。所以二進位制檔案的寫模式說明符是'wb'。其餘的是'rb','ab','r+b',和'a+b'分別。

在Python 3中,新增了一個新模式:

'x'- 獨佔建立模式:此模式專門用於建立檔案。如果已存在同名檔案,則函式呼叫將失敗。

我們來看一個如何開啟檔案和設定訪問模式的示例。

使用該open()函式時,通常會將其結果賦給變數。給定一個名為的檔案workData.txt,開啟檔案進行讀寫的正確程式碼如下:

data_file = open("workData.txt", "r+")

這將建立一個名為的物件data_file,然後我們可以使用Pythons 檔案物件方法進行操作。

我們'r+'在這個程式碼示例中使用了訪問模式,它告訴Python我們要開啟檔案進行讀寫。這為我們提供了很大的靈活性,但通常您可能希望將程式限制為只讀取或只是寫入檔案,這是其他模式派上用場的地方。

在Python中關閉檔案

在閱讀和寫作時,瞭解如何關閉檔案非常重要。

它釋放了程式用於I / O目的的系統資源。編寫具有空間或記憶體限制的程式時,可以有效地管理資源。

此外,關閉檔案可確保將任何掛起的資料寫入底層儲存系統,例如本地磁碟驅動器。透過顯式關閉檔案,您可以確保重新整理記憶體中的任何緩衝資料並將其寫入檔案。

在Python中關閉檔案的功能很簡單fileobject.close()。使用data_file我們在上一個示例中建立的檔案物件,關閉它的命令將是:

data_file.close()

關閉檔案後,在以後重新開啟檔案之前,您無法再訪問該檔案。嘗試讀取或寫入已關閉的檔案物件將引發ValueError異常:

>>> f = open("/tmp/myfile.txt", "w")
>>> f.close()
>>> f.read()Traceback (most recent call last):
  File "<input>", line 1, in <module>
    f.read()ValueError: I/O operation on closed file.

在Python中,開啟和關閉檔案的最佳實踐使用with關鍵字。巢狀程式碼塊完成後,此關鍵字將自動關閉檔案:

with open("workData.txt", "r+") as workData:
    # File object is now open.
    # Do stuff with the file:
    workData.read()
# File object is now closed.
# Do other things...

如果您不使用該with關鍵字或使用該fileobject.close()函式,那麼Python將透過內建的垃圾收集器自動關閉並銷燬檔案物件。但是,根據您的程式碼,此垃圾收集可以隨時進行。

所以建議使用with關鍵字來控制何時關閉檔案 - 即在內部程式碼塊完成執行之後。

使用Python檔案物件

成功開啟檔案後,可以使用內建方法處理新檔案物件。您可以從中讀取資料,也可以向其中寫入新資料。還有其他操作,如移動“讀/寫指標”,它確定從中讀取檔案資料的位置以及寫入的位置。

接下來,將學習如何從開啟的檔案中讀取資料:

在Python中從檔案中讀取資料

讀取檔案的內容使用該fileobject.read(size)方法。預設情況下,此方法將讀取整個檔案並將其作為字串(在文字模式下)或位元組物件(在二進位制模式下)列印到控制檯。

但是,使用預設大小時必須小心。如果您正在閱讀的檔案大於可用記憶體,則無法一次訪問整個檔案。在這種情況下,您需要使用該size引數將其分解為記憶體可以處理的塊。

該size引數告訴read方法有多少位元組進入檔案返回顯示。因此,我們假設我們的“workData.txt”檔案中包含以下文字:

This data is on line 1
This data is on line 2
This data is on line 3

然後,如果您在Python 3中編寫以下程式:

with open("workData.txt", "r+") as work_data:
    print("This is the file name: ", work_data.name)
    line = work_data.read()
    print(line)

你會得到這個輸出:

This is the file name: workData.txt
This data is on line 1
This data is on line 2
This data is on line 3

另一方面,如果你調整第三行說:

line = workData.read(6)

您將獲得以下輸出:

This is the file name: workData.txt
This d

如您所見,讀取操作僅讀取檔案中的資料到位6,這是我們傳遞給read()上面的呼叫的內容。這樣,您可以一次性限制從檔案中讀取的資料量。

如果再次從同一檔案物件中讀取,它將繼續讀取您中斷的資料。這樣,您就可以在幾個較小的“塊”中處理大型檔案。

逐行閱讀文字檔案 readline()

您還可以透過逐行讀取來解析檔案中的資料。這可以讓您逐行掃描整個檔案,只在您想要的時候前進,或者讓您看到特定的行。

該fileobject.readline(size)方法預設返回檔案的第一行。但是透過更改整數size引數,您可以獲得所需檔案中的任何行。

例如:

with open("workData.txt", "r+") as work_data:
     print("This is the file name: ", work_data.name)
     line_data = work_data.readline()
     print(line_data)

這將返回以下輸出:

This is the file name:  workData.txt
This data is on line 1

將a 2或a 3作為size變數將相應地返回第二行或第三行。

類似的方法是fileobject.readlines()呼叫(注意複數),它以元組格式返回每一行。如果您打電話:

print(work_data.readlines())

您將獲得以下輸出:

['This data is on line 1', 'This data is on line 2', 'This data is on line 3']

如您所見,這會將整個檔案讀入記憶體並將其拆分為多行。但這僅適用於文字檔案。二進位制檔案只是一個資料塊 - 它實際上並不具有單行的概念。

逐行處理整個文字檔案

在Python中逐行處理整個文字檔案的最簡單方法是使用一個簡單的迴圈:

with open("workData.txt", "r+") as work_data:
    for line in work_data:
        print(line)

這有以下輸出:

This data is on line 1
This data is on line 2
This data is on line 3

這種方法非常節省記憶體,因為我們將單獨讀取和處理每一行。這意味著我們的程式永遠不需要立即將整個檔案讀入記憶體。因此,使用readline()是一種以較小的塊處理大文字檔案的舒適且有效的方式。

使用Python寫入檔案到Python write()

如果您無法向他們寫入資料,那麼檔案就不會有任何好處。

請記住,當您建立新檔案物件時,如果檔案尚不存在,Python將建立該檔案。首次建立檔案時,您應該使用a+或w+模式。

通常最好使用該a+模式,因為資料將預設新增到檔案的末尾。使用w+將清除檔案中的任何現有資料,併為您提供“空白”。

在Python中寫入檔案的預設方法是使用fileobject.write(data)。例如,您可以使用以下程式碼在我們的“workData.txt”檔案中新增一個新行:

work_data.write("This data is on line 4n")

的n充當新行指示,移動後續寫入到下一行。

如果要將不是字串的內容寫入文字檔案(例如一系列數字),則必須使用轉換程式碼將它們轉換或“轉換”為字串。

例如,如果要將整數1234,5678,9012新增到work_data檔案中,則執行以下操作。首先,將非字串轉換為字串,然後將該字串寫入檔案物件:

values = [1234, 5678, 9012]with open("workData.txt", "a+") as work_data:
    for value in values:
        str_value = str(value)
        work_data.write(str_value)
        work_data.write("n")

檔案搜尋:移動讀/寫指標

請記住,使用a+模式編寫時,檔案指標始終位於檔案末尾。因此,在我們編寫兩個數字的情況下使用上面的程式碼,如果你使用這個fileobject.write()方法,你就不會得到任何回報。那是因為該方法正在尋找指向其他文字的指標。

那麼你需要做的是將指標移回檔案的開頭。最簡單的方法是使用該fileobject.seek(offset, from_what)方法。在此方法中,您將指標放在特定位置。

偏移量是from_what引數中的字元數。該from_what引數有三個可能的值:

0 - 表示檔案的開頭

1 - 表示當前指標位置

2 - 表示檔案的結尾

當您使用文字檔案(那些在模式下沒有使用ab開啟的檔案)時,您只能使用預設值0或a seek(0, 2),它將帶您到檔案的末尾。

因此,透過work_data.seek(3, 0)在我們的“workData.txt”檔案中使用,您將指標放在第4個字元處(請記住,Python開始計數為0)。如果使用行列印迴圈,則會得到以下輸出:

s data is on line 1
This data is on line 2
This data is on line 3

如果要檢查指標的當前位置,可以使用該fileobject.tell()方法,該方法返回當前檔案中指標所在位置的十進位制值。如果我們想查詢當前work_data檔案的時長,我們可以使用以下程式碼:

with open("workData.txt", "a+") as work_data:
    print(work_data.tell())

這將返回69,這是檔案的大小。

使用Python編輯現有文字檔案

您需要編輯現有檔案而不是僅向其附加資料。你不能只使用w+模式來做到這一點。請記住,該模式w將完全覆蓋該檔案,因此即使使用fileobject.seek(),您也無法執行此操作。而且a+總是在檔案的末尾插入任何資料。

最簡單的方法是將整個檔案拉出來並使用它建立列表或陣列資料型別。建立列表後,您可以使用該list.insert(i, x)方法插入新資料。建立新列表後,您可以將其重新連線在一起並將其寫回檔案。

請記住,對於list.insert(i, x),i是一個整數,表示細胞數。然後將x的資料放在指示的列表中的單元格之前i。

例如,使用我們的“workData.txt”檔案,假設我們需要在第一行和第二行之間插入文字行“這在第1行和第2行之間”。這樣做的程式碼是:

# Open the file as read-only
with open("workData.txt", "r") as work_data:
    work_data_contents = work_data.readlines()
work_data_contents.insert(1, "This goes between line 1 and 2n")
# Re-open in write-only format to overwrite old file
with open("workData.txt", "w") as work_data:
    work_dataContents = "".join(work_data_contents)
    work_data.write(work_data_contents)

執行此程式碼後,如果執行以下操作:

with open("workData.txt", "r") as work_data:
    for line in work_data:
        print(line)

你會得到一個輸出:

This data is on line 1
This goes between line 1 and 2
This data is on line 2
This data is on line 3

現在就演示瞭如何在Python中編輯現有的文字檔案,在您想要的位置插入新的文字行。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2508/viewspace-2837524/,如需轉載,請註明出處,否則將追究法律責任。

相關文章