
檔案對象提供了 read() 方法來按位元組或字元讀取檔案内容,到底是讀取宇節還是字元,則取決于是否使用了 b 模式,如果使用了 b 模式,則每次讀取一個位元組;如果沒有使用 b 模式,則每次讀取一個字元。在調用該方法時可傳入一個整數作為參數,用于指定最多讀取多少個位元組或宇符。
例如,如下程式采用循環讀取整個檔案的内容:f = open("read_test.py", 'r', True)
while True:
# 每次讀取一個字元
ch = f.read(1)
# 如果沒有讀到資料,跳出循環
if not ch: break
# 輸出ch
print(ch, end='')
f.close()
上面程式采用循環依次讀取每一個字元(因為程式沒有使用 b 模式),每讀取到一個字元,程式就輸出該字元。
正如從上面程式所看到的,當程式讀寫完檔案之後,推薦立即調用 close() 方法來關閉檔案,這樣可以避免資源洩露。如果需要更安全地關閉檔案,推薦将關閉檔案的 close() 方法調用在 finally 塊中執行。例如,将上面程式改為如下形式:f =open ("test.txt",'r',True)
try:
while true:
#每次讀取一個字元
ch = f.read(1)
#如果沒有讀取到資料,則跳出循環
if not ch:break
#輸出ch
print(ch, end='')
finally:
f.close()
如果在調用 read() 方法時不傳入參數,該方法預設會讀取全部檔案内容。例如如下程式:f = open("test.txt", 'r', True)
# 直接讀取全部檔案
print(f.read())
f.close()
通過上面兩個程式,讀者可能已經發現了一個問題,當使用 open() 函數打開文本檔案時,程式使用的是哪種字元集呢?總是使用目前作業系統的字元集,比如 Windows 平台,open() 函數總是使用 GBK 字元集。是以,上面程式讀取的 test.txt 也必須使用 GBK 字元集儲存;否則,程式就會出現 UnicodeDecodeError 錯誤。
如果要讀取的檔案所使用的字元集和目前作業系統的字元集不比對,則有兩種解決方式:
使用二進制模式讀取,然後用 bytes 的 decode() 方法恢複成字元串。
利用 codecs 子產品的 open() 函數來打開檔案,該函數在打開檔案時允許指定字元集。
下面程式使用二進制模式來讀取文本檔案:# 指定使用二進制方式讀取檔案内容
f = open("read_test3.py", 'rb', True)
# 直接讀取全部檔案,并調用bytes的decode将位元組内容恢複成字元串
print(f.read().decode('utf-8'))
f.close()
上面程式在調用 open() 函數時,傳入了 rb 模式,這表明采用二進制模式讀取檔案,此時檔案對象的 read() 方法傳回的是 bytes 對象,程式可調用 bytes 對象的 decode() 方法将它恢複成字元串。由于此時讀取的 read_test3.py 檔案是以 UTF-8 的格式儲存的,是以程式需要使用 decode() 方法恢複字元串時顯式指定使用 UTF-8 字元集。
下面程式使用 codes 子產品的 open() 函數來打開檔案,此時可以顯式指定字元集:import codecs
#指定使用utf-8 字元集讀取檔案内容
f = codecs.open("read_test4.py", 'r', 'utf-8', buffering=True)
while True:
#每次讀取一個字元
ch = f.read(1)
#如果沒有讀取到資料,則跳出循環
if not ch : break
#輸出ch
print (ch, end='')
f.close()