上章我們還有個(gè)問題沒有解決,就是我們讀取的這個(gè)文本文件內(nèi)容,打印出來是亂碼的。
讀取文本文件亂碼有兩個(gè)可能,我們前面研究過,第一個(gè)原因就是存亂了,很明顯這是不太可能的。
因?yàn)檫@個(gè)文本文件我們是直接在pycharm里面創(chuàng)建寫的,pycharm默認(rèn)就會(huì)幫我們保存成UTH-8格式。
所以只能是第二個(gè)原因,就是取亂了。
當(dāng)你用read()功能來讀文件的時(shí)候,它會(huì)先向操作系統(tǒng)發(fā)請(qǐng)求,告訴操作系統(tǒng):‘我要把這個(gè)文件的內(nèi)容從硬盤讀入到內(nèi)存?!?/p>
而這個(gè)文件存的時(shí)候我們使用UTF-8存操硬盤的,我們這里指定的讀取文件的模式又是t模式,t模式我們說了讀寫都是以str為單位的,而str我們又可以把它看成是Unicode。
所以read本質(zhì)讀取的是硬盤里的utf-8格式的二進(jìn)制,但是由于t模式的存在,t模式會(huì)強(qiáng)制讓read把讀出來的utf-8格式的二進(jìn)制轉(zhuǎn)成Unicode。
t模式就會(huì)有這么一個(gè)解碼的過程。
但是我們用open功能打開文件的時(shí)候,我們并沒有指定utf-8編碼方式來解碼,我們沒指定,那它一定會(huì)用一個(gè)它默認(rèn)的編碼來解。
由于open是對(duì)操作系統(tǒng)發(fā)請(qǐng)求的,這個(gè)文件也是由操作系統(tǒng)打開的,偶們對(duì)操作系統(tǒng)發(fā)請(qǐng)求的時(shí)候也沒告訴操作系統(tǒng)用什么編碼來打開文件,那操作系統(tǒng)就會(huì)用它默認(rèn)的打開方式來打開。
在Linux和Mac上面默認(rèn)的編碼就是utf-8,而在Windows上面默認(rèn)編碼是GBK,所以你用的是Linux和Mac,你沒指定編碼方式的話就不會(huì)亂碼,但是到了Windows平臺(tái)上,就會(huì)出現(xiàn)亂碼。
當(dāng)然由于我們這個(gè)文件里的內(nèi)容較少,這幾個(gè)字所對(duì)應(yīng)的編碼數(shù)字剛好GBK里面也有,所以這里是亂碼狀態(tài)。
現(xiàn)在我多打幾個(gè)字,這時(shí)候可能我信達(dá)的這些字uft-8編碼對(duì)應(yīng)的數(shù)字在GNK里面完全不存在嗎,這時(shí)候亂碼的機(jī)會(huì)都不會(huì)給我們。
直接報(bào)錯(cuò)說Unicode解碼錯(cuò)誤。
針對(duì)這種不同平臺(tái)的解碼方式不同的情況,我們就應(yīng)該給open功能指定一個(gè)encoding參數(shù),讓它等于utf-8。
f = open('date/a.txt', mode='rt', encoding='utf-8')
這樣解碼的時(shí)候它就會(huì)告訴操作系統(tǒng),你給我做好準(zhǔn)備,我要按照utf-8的方式來打開這個(gè)文件,到了用read讀的時(shí)候,它就會(huì)看你用的t模式那我應(yīng)該把讀出來的二進(jìn)制數(shù)據(jù)轉(zhuǎn)成Unicode。
然后看encoding參數(shù),utf-8。那她就會(huì)按照utf-8來轉(zhuǎn)Unicode。
這樣讀出來的數(shù)據(jù)就不會(huì)亂碼了,
這是t模式下的讀操作,如果是t模式下的寫操作,也是一樣的道理。
為了跨平臺(tái)性,不管是什么操作系統(tǒng),都應(yīng)該指定encoding參數(shù)。
最重要的是只能是文本文件下才能這么操作。
未經(jīng)允許不得轉(zhuǎn)載:445IT之家 » Python 指定字符編碼