Python 提供了如下 3 種函數,它們都可以幫我們實現讀取文件中數據的操作:
- read() 函數:逐個字節或者字符讀取文件中的內容;
- readline() 函數:逐行讀取文件中的內容;
- readlines() 函數:一次性讀取文件中多行內容。
read()函數,返回整個文件的內容成一個字節(字符)串
對於借助 open() 函數,並以可讀模式(包括 r、r+、rb、rb+)打開的文件,可以調用 read() 函數逐個字節(或者逐個字符)讀取文件中的內容。
如果文件是以文本模式(非二進制模式)打開的,則 read() 函數會逐個字符進行讀取;反之,如果文件以二進制模式打開,則 read() 函數會逐個字節進行讀取。
read() 函數的基本語法格式如下:
file.read([size])
其中,file 表示已打開的文件對象;size 作為一個可選參數,用於指定一次最多可讀取的字符(字節)個數,如果省略,則默認一次性讀取所有內容。
舉例:
f = open("my_file.txt",encoding = "utf-8")
print(f.read())
f.close()
當然,我們也可以通過使用 size 參數,指定 read() 每次可讀取的最大字符(或者字節)數。再次強調,size 表示的是一次最多可讀取的字符(或字節)數,因此,即便設置的 size 大於文件中存儲的字符(字節)數,read() 函數也不會報錯,它只會讀取文件中所有的數據。
除此之外,對於以二進制格式打開的文件,read() 函數會逐個字節讀取文件中的內容。例如:
f = open("my_file.txt",'rb+')
print(f.read())
f.close()
程序執行結果為:
b'Python\xe6\x95\x99\xe7\xa8\x8b\r\nhttp://c.biancheng.net/python/'
可以看到,輸出的數據為 bytes 字節串。我們可以調用 decode() 方法,將其轉換成我們認識的字符串。
read()函數拋出UnicodeDecodeError異常的解決方法
在使用 read() 函數時,如果 Python 解釋器提示UnicodeDecodeError異常,其原因在於,目標文件使用的編碼格式和 open() 函數打開該文件時使用的編碼格式不匹配。
舉個例子,如果目標文件的編碼格式為 GBK 編碼,而我們在使用 open() 函數並以文本模式打開該文件時,手動指定 encoding 參數為 UTF-8。這種情況下,由於編碼格式不匹配,當我們使用 read() 函數讀取目標文件中的數據時,Python 解釋器就會提示UnicodeDecodeError異常。
要解決這個問題,則需要修改encoding參數或者修改文件的編碼格式,即要么將 open() 函數中的 encoding 參數值修改為和目標文件相同的編碼格式,要么重新生成目標文件(即將該文件的編碼格式改為和 open() 函數中的 encoding 參數相同)。
除此之外,還有一種方法:先使用二進制模式讀取文件,然后調用 bytes 的 decode() 方法,使用目標文件的編碼格式,將讀取到的字節串轉換成認識的字符串。
#以二進制形式打開指定文件,該文件編碼格式為 utf-8
f = open("my_file.txt",'rb+')
byt = f.read()
print(byt)
print("\n轉換后:")
print(byt.decode('utf-8'))
#關閉文件
f.close()
readline()函數,按行讀取文件,返回一行的字節(字符)串
readline() 函數用於讀取文件中的一行,包含最后的換行符“\n”。此函數的基本語法格式為:
file.readline([size])
其中,file 為打開的文件對象;size 為可選參數,用於指定讀取每一行時,一次最多讀取的字符(字節)數。
舉例:
f = open("my_file.txt")
讀取一行數據
byt = f.readline()
print(byt)
由於 readline() 函數在讀取文件中一行的內容時,會讀取最后的換行符“\n”,再加上 print() 函數輸出內容時默認會換行,所以輸出結果中會看到多出了一個空行。
不僅如此,在逐行讀取時,也可以限制最多可以讀取的字符(字節)數,如byt = f.readline(6)
readlines()函數,按行讀取文件,返回一個字節(字符)串列表
readlines() 函數用於讀取文件中的所有行,它和調用不指定 size 參數的 read() 函數類似,只不過該函數返回是一個字符串列表,其中每個元素為文件中的一行內容。和 readline() 函數一樣,readlines() 函數在讀取每一行時,會連同行尾的換行符一塊讀取。
readlines() 函數的基本語法格式如下:
file.readlines()
其中,file 為打開的文件對象。和 read()、readline() 函數一樣,它要求打開文件的模式必須為可讀模式(包括 r、rb、r+、rb+ 4 種)。
舉例:
f = open("my_file.txt",'rb')
byt = f.readlines()
print(byt)