文件是磁盤上用于存儲相關(guān)信息的命名位置。它用于將數(shù)據(jù)永久存儲在非易失性存儲器(例如硬盤)中。
由于隨機存取存儲器(RAM)易失,當(dāng)計算機關(guān)閉時會丟失其數(shù)據(jù),因此我們將文件用于將來的數(shù)據(jù)使用。
當(dāng)我們要讀取或?qū)懭胛募r,我們需要先打開它。完成后,需要將其關(guān)閉,以便釋放與文件綁定的資源。
因此,在Python中,文件操作按以下順序進行。
打開文件
讀取或?qū)懭耄▓?zhí)行操作)
關(guān)閉文件
Python具有內(nèi)置函數(shù)open()來打開文件。此函數(shù)返回文件對象,也稱為句柄,因為它用于相應(yīng)地讀取或修改文件。
>>> f = open("test.txt") # 打開當(dāng)前目錄中的文件 >>> f = open("C:/Python33/README.txt") # 指定完整路徑
我們可以在打開文件時指定模式。在模式下,我們指定是要讀取'r',寫入'w'還是追加'a'到文件。我們還指定是否要以文本模式或二進制模式打開文件。
默認(rèn)設(shè)置是在文本模式下閱讀。在這種模式下,當(dāng)從文件中讀取時,我們會得到字符串。
另一方面,二進制模式返回字節(jié),這是處理非文本文件(如圖像或exe文件)時要使用的模式。
模式 | 描述 |
---|---|
'r' | 打開文件進行讀取。(默認(rèn)) |
'w' | 打開文件進行寫入。如果不存在則創(chuàng)建一個新文件,或者如果存在則將其截斷。 |
'x' | 打開文件以進行獨占創(chuàng)建。如果文件已經(jīng)存在,則操作失敗。 |
'a' | 打開以在文件末尾追加而不截斷。如果不存在,則創(chuàng)建一個新文件。 |
't' | 以文本模式打開。(默認(rèn)) |
'b' | 以二進制模式打開。 |
'+' | 打開文件進行更新(讀取和寫入) |
f = open("test.txt") # 等同于“ r”或“ rt” f = open("test.txt",'w') # 文本模式寫入 f = open("img.bmp",'r+b') # 以二進制模式讀取和寫入
與其他語言不同,該字符'a'在使用ASCII(或其他等效編碼)進行編碼之前不會暗示數(shù)字97 。
此外,默認(rèn)編碼取決于平臺。在Windows中,'cp1252'但是'utf-8'在Linux中。
因此,我們也不能依賴默認(rèn)編碼,否則我們的代碼在不同平臺上的行為會有所不同。
因此,在以文本模式處理文件時,強烈建議指定編碼類型。
f = open("test.txt",mode = 'r',encoding = 'utf-8')
完成對文件的操作后,我們需要正確關(guān)閉文件。
關(guān)閉文件將釋放與該文件綁定的資源,并且使用close()方法完成 。
Python有一個垃圾收集器來清理未引用的對象,但是,我們絕對不能依靠它來關(guān)閉文件。
f = open("test.txt",encoding = 'utf-8') # 執(zhí)行文件操作 f.close()
這種方法并不完全安全。如果對文件執(zhí)行某些操作時發(fā)生異常,則代碼將退出而不關(guān)閉文件。
一種更安全的方法是使用try ... finally塊。
try: f = open("test.txt",encoding = 'utf-8') # 執(zhí)行文件操作 finally: f.close()
這樣,我們可以保證即使引發(fā)異常也可以正確關(guān)閉文件,從而導(dǎo)致程序流停止。
最好的方法是使用with語句。這樣可以確保在with退出內(nèi)部塊時關(guān)閉文件。
我們不需要顯式調(diào)用該close()方法。它是在內(nèi)部完成的。
with open("test.txt",encoding = 'utf-8') as f: # 執(zhí)行文件操作
為了用Python寫入文件,我們可以以 'w' 模式寫入,'a'模式追加或獨占創(chuàng)建'x'模式打開它。
我們需要謹(jǐn)慎使用該'w'模式,因為它會覆蓋文件(如果已存在)。以前的所有數(shù)據(jù)都將被刪除。
寫入字符串或字節(jié)序列(對于二進制文件)是使用write()方法完成的。此方法返回寫入文件的字符數(shù)。
with open("test.txt",'w',encoding = 'utf-8') as f: f.write("my first file\n") f.write("This file\n\n") f.write("contains three lines\n")
'test.txt'如果不存在,該程序?qū)?chuàng)建一個名為的新文件。如果確實存在,則將其覆蓋。
我們必須自己包括換行符,以區(qū)分不同的行。
要使用Python讀取文件,我們必須以讀取模式打開文件。
有多種方法可用于此目的。我們可以使用該read(size)方法讀取大小數(shù)據(jù)。如果未指定size參數(shù),它將讀取并返回到文件末尾。
>>> f = open("test.txt",'r',encoding = 'utf-8') >>> f.read(4) # 讀取前4個數(shù)據(jù) 'This' >>> f.read(4) # 讀取接下來的4個數(shù)據(jù) ' is ' >>> f.read() # 讀取其余部分,直到文件末尾 'my first file\nThis file\ncontains three lines\n' >>> f.read() # 進一步讀取返回空字符串 ''
我們可以看到,read()方法將換行符返回為'\n'。到達(dá)文件末尾后,我們將在進一步閱讀時得到空字符串。
我們可以使用seek()方法更改當(dāng)前文件的光標(biāo)(位置)。同樣,tell()方法返回我們的當(dāng)前位置(以字節(jié)數(shù)為單位)。
>>> f.tell() # 獲取當(dāng)前文件位置 56 >>> f.seek(0) # 將文件光標(biāo)移到初始位置 0 >>> print(f.read()) # 讀取整個文件 This is my first file This file contains three lines
我們可以使用for循環(huán)逐行讀取文件。這既高效又快速。
>>> for line in f: ... print(line, end = '') ... This is my first file This file contains three lines
文件本身的行具有換行符'\n'。
此外,print()結(jié)束參數(shù)在打印時避免了兩行換行。
或者,我們可以使用readline()方法讀取文件的各個行。此方法讀取文件,直到換行符為止,包括換行符。
>>> f.readline() 'This is my first file\n' >>> f.readline() 'This file\n' >>> f.readline() 'contains three lines\n' >>> f.readline() ''
最后,該readlines()方法返回整個文件的其余行的列表。當(dāng)?shù)竭_(dá)文件結(jié)尾(EOF)時,所有這些讀取方法都將返回空值。
>>> f.readlines() ['This is my first file\n', 'This file\n', 'contains three lines\n']
文件對象有多種可用方法。其中一些已在以上示例中使用。
這是文本模式下方法的完整列表,并帶有簡要說明。
close() | 關(guān)閉文件。 |
detach() | 從緩沖區(qū)返回分離的原始流(raw stream)。 |
fileno() | 從操作系統(tǒng)的角度返回表示流的數(shù)字。 |
flush() | 刷新內(nèi)部緩沖區(qū)。 |
isatty() | 返回文件流是否是交互式的。 |
read() | 返回文件內(nèi)容。 |
readable() | 返回是否能夠讀取文件流。 |
readline() | 返回文件中的一行。 |
readlines() | 返回文件中的行列表。 |
seek() | 更改文件位置。 |
seekable() | 返回文件是否允許我們更改文件位置。 |
tell() | 返回當(dāng)前的文件位置。 |
truncate() | 把文件調(diào)整為指定的大小。 |
writeable() | 返回是否能夠?qū)懭胛募?/td> |
write() | 把指定的字符串寫入文件。 |
writelines() | 把字符串列表寫入文件。 |