首頁>技術>

讀檔案

用 open() 方法開啟檔案,返回一個檔案物件,如下:

f = open('test.txt', 'r')

r 表示文字檔案,rb 表示二進位制檔案。(預設引數是 r )

如果檔案不存在,open() 函式就會丟擲一個IOError的錯誤,並且給出錯誤碼和詳細的資訊告訴你檔案不存在:

>>> f=open('test.txt', 'r')Traceback (most recent call last):  File "<stdin>", line 1, in <module>FileNotFoundError: [Errno 2] No such file or directory: 'test.txt'

檔案使用完畢後必須關閉,因為檔案物件會佔用作業系統的資源,並且作業系統同一時間能開啟的檔案數量也是有限的。

f.close()

由於檔案讀寫時都有可能產生IOError,一旦出錯,後面的f.close()就不會呼叫。所以,為了保證無論是否出錯都能正確地關閉檔案,我們可以使用try … finally來實現,如下:

try:    f = open('test.txt', 'r')    print(f.read())finally:    if f:        f.close()

但每次這麼寫很麻煩,Python引入with語句自動幫我們呼叫close()方法,如下:

with open('test.txt', 'r') as f:    print(f.read())

python檔案物件提供了三個“讀”方法: read()、readline() 和 readlines()。每種方法可以接受一個變數以限制每次讀取的資料量。

read() 每次讀取整個檔案,它通常用於將檔案內容放到一個字串變數中。如果檔案大於可用記憶體,為了保險起見,可以反覆呼叫read(size)方法,每次最多讀取size個位元組的內容。readlines() 之間的差異是後者一次讀取整個檔案,象 .read() 一樣。.readlines() 自動將檔案內容分析成一個行的列表,該列表可以由 Python 的 for … in … 結構進行處理。readline() 每次只讀取一行,通常比readlines() 慢得多。僅當沒有足夠記憶體可以一次讀取整個檔案時,才應該使用 readline()。

注意: 這三種方法都會把每行末尾的 \n 也讀入,因此需要手動去除 \n ,如下:

with open('test1.txt', 'r') as f1:    list1 = f1.readlines()for i in range(0, len(list1)):    list1[i] = list1[i].rstrip('\n')    #去除末尾的 \n
寫檔案

寫檔案也是用 open() 函式,不同的是傳入識別符號 w wb a ab, 如下:

f = open('test.txt', 'w') # 若是'wb'就表示寫二進位制檔案f.write('Hello, world!')f.close()
w 是指:如果沒有這個檔案,就新建一個;如果有,就把原檔案清空再寫入新內容。a 是指:如果沒有這個檔案,就新建一個;如果有,就接在原檔案的後面寫入新內容。

注意: 我們可以反覆呼叫write()來寫入檔案,但是務必要呼叫f.close()來關閉檔案。當我們寫檔案時,作業系統往往不會立刻把資料寫入磁碟,而是放到記憶體快取起來,空閒的時候再慢慢寫入。只有呼叫close()方法時,作業系統才保證把沒有寫入的資料全部寫入磁碟。忘記呼叫close()的後果是資料可能只寫了一部分到磁碟,剩下的丟失了。所以,還是用with語句來得保險:

with open('test.txt', 'w') as f:    f.write('Hello, world!')

python檔案物件提供了兩個“寫”方法: write() 和 writelines()。

write()方法和read()、readline()方法對應,是將字串寫入到檔案中。writelines()方法和readlines()方法對應,也是針對列表的操作。它接收一個字串列表作為引數,將他們寫入到檔案中,換行符不會自動的加入,因此,需要顯式的加入換行符。
f1 = open('test1.txt', 'w')f1.writelines(["1", "2", "3"])#    此時test1.txt的內容為:123f1 = open('test1.txt', 'w')f1.writelines(["1\n", "2\n", "3\n"])#    此時test1.txt的內容為:#    1#    2        #    3
關於open()的mode引數:‘r’:讀‘w’:寫‘a’:追加‘r+’ == r+w(可讀可寫,檔案若不存在就報錯(IOError))‘w+’ == w+r(可讀可寫,檔案若不存在就建立)‘a+’ ==a+r(可追加可寫,檔案若不存在就建立)

對應的,如果是二進位制檔案,就都加一個b就好了:‘rb’  ‘wb’  ‘ab’  ‘rb+’  ‘wb+’  ‘ab+’

字元編碼

預設情況下是讀取 UTF-8 編碼的文字檔案,如果要讀取其他編碼,需要給open()函式傳入encoding引數,例如,讀取GBK編碼的檔案:

f = open('test.txt', 'r', encoding='gbk')

遇到有些編碼不規範的檔案,你可能會遇到UnicodeDecodeError,因為在文字檔案中可能夾雜了一些非法編碼的字元。遇到這種情況,open()函式還接收一個errors引數,表示如果遇到編碼錯誤後如何處理。最簡單的方式是直接忽略:

f = open('test.txt', 'r', encoding='gbk', errors='ignore')

14
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 圖文並茂,從彙編層理解C++ 引用與指標的聯絡