溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python中文件讀寫的操作方法

發(fā)布時間:2020-08-03 10:33:29 來源:億速云 閱讀:221 作者:清晨 欄目:編程語言

小編給大家分享一下Python中文件讀寫的操作方法,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!

Python中的文件讀寫-實際操作

Python中文件讀寫的操作方法

用Python打開文件

你需要知道的第一個功能是open()。在Python 2和Python 3中,此命令將返回參數(shù)中指定的文件對象?;竟δ苡梅╫pen()如下:

file_object = open(filename, mode)

在此實例中,filename是您要與之交互的文件的名稱,包含文件擴展名。也就是說,如果你有一個文本文件workData.txt,你的文件名不僅僅是"workData"。是的"workData.txt"。

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

但請記住,字符串中的單個反斜杠向Python指示字符串文字的開頭。所以這里有一個問題,因為這兩個含義會發(fā)生沖突......

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

open函數(shù)中的模式告訴Python你要對文件做什么。處理文本文件時可以指定多種模式。

'w'- 寫入模式:當需要更改文件并更改或添加信息時,使用此模式。請記住,這會擦除現(xiàn)有文件以創(chuàng)建新文件。文件指針位于文件的開頭。

'r'- 讀取模式:當文件中的信息僅用于讀取而不以任何方式更改時,使用此模式。文件指針位于文件的開頭。

'a'- 附加模式:此模式自動將信息添加到文件末尾。文件指針放在文件的末尾。

'r+'- 讀/寫模式:當您要更改文件并從中讀取信息時使用。文件指針位于文件的開頭。

'a+'- 附加和讀取模式:打開文件以允許將數(shù)據(jù)添加到文件末尾,并讓程序也讀取信息。文件指針放在文件的末尾。

使用二進制文件時,將使用相同的模式說明符。但是,您將ab添加到最后。所以二進制文件的寫模式說明符是'wb'。其余的是'rb','ab','r+b',和'a+b'分別。

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

'x'- 獨占創(chuàng)建模式:此模式專門用于創(chuàng)建文件。如果已存在同名文件,則函數(shù)調(diào)用將失敗。

我們來看一個如何打開文件和設置訪問模式的示例。

使用該open()函數(shù)時,通常會將其結(jié)果賦給變量。給定一個名為的文件workData.txt,打開文件進行讀寫的正確代碼如下:

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

這將創(chuàng)建一個名為的對象data_file,然后我們可以使用Pythons 文件對象方法進行操作。

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

在Python中關閉文件

在閱讀和寫作時,了解如何關閉文件非常重要。

它釋放了程序用于I / O目的的系統(tǒng)資源。編寫具有空間或內(nèi)存限制的程序時,可以有效地管理資源。

此外,關閉文件可確保將任何掛起的數(shù)據(jù)寫入底層存儲系統(tǒng),例如本地磁盤驅(qū)動器。通過顯式關閉文件,您可以確保刷新內(nèi)存中的任何緩沖數(shù)據(jù)并將其寫入文件。

在Python中關閉文件的功能很簡單fileobject.close()。使用data_file我們在上一個示例中創(chuàng)建的文件對象,關閉它的命令將是:

data_file.close()

關閉文件后,在以后重新打開文件之前,您無法再訪問該文件。嘗試讀取或?qū)懭胍殃P閉的文件對象將引發(fā)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()函數(shù),那么Python將通過內(nèi)置的垃圾收集器自動關閉并銷毀文件對象。但是,根據(jù)您的代碼,此垃圾收集可以隨時進行。

所以建議使用with關鍵字來控制何時關閉文件 - 即在內(nèi)部代碼塊完成執(zhí)行之后。

使用Python文件對象

成功打開文件后,可以使用內(nèi)置方法處理新文件對象。您可以從中讀取數(shù)據(jù),也可以向其中寫入新數(shù)據(jù)。還有其他操作,如移動“讀/寫指針”,它確定從中讀取文件數(shù)據(jù)的位置以及寫入的位置。

接下來,將學習如何從打開的文件中讀取數(shù)據(jù):

在Python中從文件中讀取數(shù)據(jù)

讀取文件的內(nèi)容使用該fileobject.read(size)方法。默認情況下,此方法將讀取整個文件并將其作為字符串(在文本模式下)或字節(jié)對象(在二進制模式下)打印到控制臺。

但是,使用默認大小時必須小心。如果您正在閱讀的文件大于可用內(nèi)存,則無法一次訪問整個文件。在這種情況下,您需要使用該size參數(shù)將其分解為內(nèi)存可以處理的塊。

該size參數(shù)告訴read方法有多少字節(jié)進入文件返回顯示。因此,我們假設我們的“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

另一方面,如果你調(diào)整第三行說:

line = workData.read(6)

您將獲得以下輸出:

This is the file name: workData.txt
This d

如您所見,讀取操作僅讀取文件中的數(shù)據(jù)到位6,這是我們傳遞給read()上面的調(diào)用的內(nèi)容。這樣,您可以一次性限制從文件中讀取的數(shù)據(jù)量。

如果再次從同一文件對象中讀取,它將繼續(xù)讀取您中斷的數(shù)據(jù)。這樣,您就可以在幾個較小的“塊”中處理大型文件。

逐行閱讀文本文件 readline()

您還可以通過逐行讀取來解析文件中的數(shù)據(jù)。這可以讓您逐行掃描整個文件,只在您想要的時候前進,或者讓您看到特定的行。

該fileobject.readline(size)方法默認返回文件的第一行。但是通過更改整數(shù)size參數(shù),您可以獲得所需文件中的任何行。

例如:

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()調(diào)用(注意復數(shù)),它以元組格式返回每一行。如果您打電話:

print(work_data.readlines())

您將獲得以下輸出:

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

如您所見,這會將整個文件讀入內(nèi)存并將其拆分為多行。但這僅適用于文本文件。二進制文件只是一個數(shù)據(jù)塊 - 它實際上并不具有單行的概念。

逐行處理整個文本文件

在Python中逐行處理整個文本文件的最簡單方法是使用一個簡單的循環(huán):

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

這種方法非常節(jié)省內(nèi)存,因為我們將單獨讀取和處理每一行。這意味著我們的程序永遠不需要立即將整個文件讀入內(nèi)存。因此,使用readline()是一種以較小的塊處理大文本文件的舒適且有效的方式。

使用Python寫入文件到Python write()

如果您無法向他們寫入數(shù)據(jù),那么文件就不會有任何好處。

請記住,當您創(chuàng)建新文件對象時,如果文件尚不存在,Python將創(chuàng)建該文件。首次創(chuàng)建文件時,您應該使用a+或w+模式。

通常最好使用該a+模式,因為數(shù)據(jù)將默認添加到文件的末尾。使用w+將清除文件中的任何現(xiàn)有數(shù)據(jù),并為您提供“空白”。

在Python中寫入文件的默認方法是使用fileobject.write(data)。例如,您可以使用以下代碼在我們的“workData.txt”文件中添加一個新行:

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

的\n充當新行指示,移動后續(xù)寫入到下一行。

如果要將不是字符串的內(nèi)容寫入文本文件(例如一系列數(shù)字),則必須使用轉(zhuǎn)換代碼將它們轉(zhuǎn)換或“轉(zhuǎn)換”為字符串。

例如,如果要將整數(shù)1234,5678,9012添加到work_data文件中,則執(zhí)行以下操作。首先,將非字符串轉(zhuǎn)換為字符串,然后將該字符串寫入文件對象:

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+模式編寫時,文件指針始終位于文件末尾。因此,在我們編寫兩個數(shù)字的情況下使用上面的代碼,如果你使用這個fileobject.write()方法,你就不會得到任何回報。那是因為該方法正在尋找指向其他文本的指針。

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

偏移量是from_what參數(shù)中的字符數(shù)。該from_what參數(shù)有三個可能的值:

0 - 表示文件的開頭

1 - 表示當前指針位置

2 - 表示文件的結(jié)尾

當您使用文本文件(那些在模式下沒有使用ab打開的文件)時,您只能使用默認值0或a seek(0, 2),它將帶您到文件的末尾。

因此,通過work_data.seek(3, 0)在我們的“workData.txt”文件中使用,您將指針放在第4個字符處(請記住,Python開始計數(shù)為0)。如果使用行打印循環(huán),則會得到以下輸出:

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編輯現(xiàn)有文本文件

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

最簡單的方法是將整個文件拉出來并使用它創(chuàng)建列表或數(shù)組數(shù)據(jù)類型。創(chuàng)建列表后,您可以使用該list.insert(i, x)方法插入新數(shù)據(jù)。創(chuàng)建新列表后,您可以將其重新連接在一起并將其寫回文件。

請記住,對于list.insert(i, x),i是一個整數(shù),表示細胞數(shù)。然后將x的數(shù)據(jù)放在指示的列表中的單元格之前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 2\n")
# 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)

運行此代碼后,如果執(zhí)行以下操作:

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中文件讀寫的操作方法有了一定的了解,想了解更多相關知識,歡迎關注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI