Python? 提供了如下 3 種函數(shù),它們都可以幫我們實(shí)現(xiàn)讀取文件中數(shù)據(jù)的操作:
- read() 函數(shù):逐個(gè)字節(jié)或者字符讀取文件中的內(nèi)容;
- readline() 函數(shù):逐行讀取文件中的內(nèi)容;
- readlines() 函數(shù):一次性讀取文件中多行內(nèi)容。
這里先講解 read() 函數(shù)的用法,readline() 和 readlines() 函數(shù)會(huì)放到后面詳細(xì)介紹。
Python read()函數(shù)
對(duì)于借助 open() 函數(shù),并以可讀模式(包括 r、r+、rb、rb+)打開(kāi)的文件,可以調(diào)用 read() 函數(shù)逐個(gè)字節(jié)(或者逐個(gè)字符)讀取文件中的內(nèi)容。
如果文件是以文本模式(非二進(jìn)制模式)打開(kāi)的,則 read() 函數(shù)會(huì)逐個(gè)字符進(jìn)行讀??;反之,如果文件以二進(jìn)制模式打開(kāi),則 read() 函數(shù)會(huì)逐個(gè)字節(jié)進(jìn)行讀取。
read() 函數(shù)的基本語(yǔ)法格式如下:
file.read([size])
其中,file 表示已打開(kāi)的文件對(duì)象;size 作為一個(gè)可選參數(shù),用于指定一次最多可讀取的字符(字節(jié))個(gè)數(shù),如果省略,則默認(rèn)一次性讀取所有內(nèi)容。
舉個(gè)例子,首先創(chuàng)建一個(gè)名為 my_file.txt 的文本文件,其內(nèi)容為:
Python教程
http://www.CSDN.net/
然后在和 my_file.txt 同目錄下,創(chuàng)建一個(gè) file.py 文件,并編寫(xiě)如下語(yǔ)句:
#以 utf-8 的編碼格式打開(kāi)指定文件
f = open("my_file.txt",encoding = "utf-8")
#輸出讀取到的數(shù)據(jù)
print(f.read())
#關(guān)閉文件
f.close()
程序執(zhí)行結(jié)果為:
Python教程
http://www.CSDN.net/
注意,當(dāng)操作文件結(jié)束后,必須調(diào)用 close() 函數(shù)手動(dòng)將打開(kāi)的文件進(jìn)行關(guān)閉,這樣可以避免程序發(fā)生不必要的錯(cuò)誤。
當(dāng)然,我們也可以通過(guò)使用 size 參數(shù),指定 read() 每次可讀取的最大字符(或者字節(jié))數(shù),例如:
#以 utf-8 的編碼格式打開(kāi)指定文件
f = open("my_file.txt",encoding = "utf-8")
#輸出讀取到的數(shù)據(jù)
print(f.read(6))
#關(guān)閉文件
f.close()
程序執(zhí)行結(jié)果為:
Python
顯然,該程序中的 read() 函數(shù)只讀取了 my_file 文件開(kāi)頭的 6 個(gè)字符。
再次強(qiáng)調(diào),size 表示的是一次最多可讀取的字符(或字節(jié))數(shù),因此,即便設(shè)置的 size 大于文件中存儲(chǔ)的字符(字節(jié))數(shù),read() 函數(shù)也不會(huì)報(bào)錯(cuò),它只會(huì)讀取文件中所有的數(shù)據(jù)。
除此之外,對(duì)于以二進(jìn)制格式打開(kāi)的文件,read() 函數(shù)會(huì)逐個(gè)字節(jié)讀取文件中的內(nèi)容。例如:
#以二進(jìn)制形式打開(kāi)指定文件
f = open("my_file.txt",'rb+')
#輸出讀取到的數(shù)據(jù)
print(f.read())
#關(guān)閉文件
f.close()
程序執(zhí)行結(jié)果為:
b'Python\xe6\x95\x99\xe7\xa8\x8b\r\nhttp://www.CSDN.net/'
可以看到,輸出的數(shù)據(jù)為 bytes 字節(jié)串。我們可以調(diào)用 decode() 方法,將其轉(zhuǎn)換成我們認(rèn)識(shí)的字符串。
另外需要注意的一點(diǎn)是,想使用 read() 函數(shù)成功讀取文件內(nèi)容,除了嚴(yán)格遵守 read() 的語(yǔ)法外,其還要求 open() 函數(shù)必須以可讀默認(rèn)(包括 r、r+、rb、rb+)打開(kāi)文件。舉個(gè)例子,將上面程序中 open()的打開(kāi)模式改為 w,程序會(huì)拋出io.UnsupportedOperation
異常,提示文件沒(méi)有讀取權(quán)限:
Traceback (most recent call last):
File "C:\Users\mengma\Desktop\file.py", line 3, in <module>
print(f.read())
io.UnsupportedOperation: not readable
read()函數(shù)拋出UnicodeDecodeError異常的解決方法
在使用 read() 函數(shù)時(shí),如果 Python 解釋器提示UnicodeDecodeError
異常,其原因在于,目標(biāo)文件使用的編碼格式和 open() 函數(shù)打開(kāi)該文件時(shí)使用的編碼格式不匹配。
舉個(gè)例子,如果目標(biāo)文件的編碼格式為 GBK 編碼,而我們?cè)谑褂?open() 函數(shù)并以文本模式打開(kāi)該文件時(shí),手動(dòng)指定 encoding 參數(shù)為 UTF-8。這種情況下,由于編碼格式不匹配,當(dāng)我們使用 read() 函數(shù)讀取目標(biāo)文件中的數(shù)據(jù)時(shí),Python 解釋器就會(huì)提示UnicodeDecodeError
異常。
要解決這個(gè)問(wèn)題,要么將 open() 函數(shù)中的 encoding 參數(shù)值修改為和目標(biāo)文件相同的編碼格式,要么重新生成目標(biāo)文件(即將該文件的編碼格式改為和 open() 函數(shù)中的 encoding 參數(shù)相同)。
除此之外,還有一種方法:先使用二進(jìn)制模式讀取文件,然后調(diào)用?bytes 的 decode() 方法,使用目標(biāo)文件的編碼格式,將讀取到的字節(jié)串轉(zhuǎn)換成認(rèn)識(shí)的字符串。
舉個(gè)例子:
#以二進(jìn)制形式打開(kāi)指定文件,該文件編碼格式為 utf-8
f = open("my_file.txt",'rb+')
byt = f.read()
print(byt)
print("\n轉(zhuǎn)換后:")
print(byt.decode('utf-8'))
#關(guān)閉文件
f.close()
程序執(zhí)行結(jié)果為:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-835716.html
b'Python\xe6\x95\x99\xe7\xa8\x8b\r\nhttp://www.CSDN.net/'
轉(zhuǎn)換后:
Python教程
http://www.CSDN.net/
Python教程,8天python從入門(mén)到精通,學(xué)python看這套就夠了文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-835716.html
到了這里,關(guān)于Python read()函數(shù):按字節(jié)(字符)讀取文件的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!