天天看點

python3 read bytes_Python read函數:按位元組(字元)讀取檔案

python3 read bytes_Python read函數:按位元組(字元)讀取檔案

檔案對象提供了 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()