為什么想講這個(gè)問題讲仰?主要是最近自己遇到這個(gè)問題檐什,然后就是把自己看到的一起交流一下。
記得我們?cè)谧x取文件內(nèi)容的時(shí)候深夯,老是會(huì)涉及到編碼解碼的問題抖格,特別是有的文件內(nèi)容常用的編碼還不支持,這就令人非常的煩咕晋。下面列出一行常用的讀取文件內(nèi)容代碼雹拄。
with open('a.txt','r',encoding='utf-8') as pp:
這里面主要是三個(gè)參數(shù),第一個(gè)是文件名掌呜,第二個(gè)是只讀的方式打開文件滓玖,第三個(gè)是編碼解碼格式,為什么我要說是編碼解碼格式呢质蕉?先來普及一下基本的知識(shí)势篡。
字節(jié)和字符翩肌;字符是人類所能識(shí)別的基礎(chǔ)單元,比如英文單詞‘love’,這個(gè)單詞是由四個(gè)字母組成禁悠,四個(gè)字母中每個(gè)字母都代表我們能識(shí)別的字符單元念祭,同理中文‘你好’,你和好分別代表2個(gè)字符單元。字符大致就可以這樣簡(jiǎn)單的理解绷蹲;那么字節(jié)呢棒卷?我們都知道計(jì)算機(jī)中所能識(shí)別的都是二進(jìn)制位顾孽,也就是0-1串祝钢,一個(gè)字節(jié)就代表8位二進(jìn)制位。
字節(jié)和字符又是怎么聯(lián)系到一起呢若厚?簡(jiǎn)單的說就是怎么把人類語言轉(zhuǎn)變成計(jì)算機(jī)能讀懂的語言拦英,編碼這個(gè)時(shí)候就應(yīng)運(yùn)而生了,編碼方式的差異決定多少字節(jié)代表一個(gè)字符测秸,比如以前常見的ASCII就是一個(gè)字節(jié)對(duì)應(yīng)一個(gè)字符疤估,相當(dāng)于我制定了一個(gè)規(guī)則,然后你按照這個(gè)規(guī)則將文字(字符)轉(zhuǎn)換成計(jì)算機(jī)能理解的東西(字節(jié))霎冯。解碼呢铃拇?就是編碼的逆過程,用相應(yīng)編碼的規(guī)則將計(jì)算機(jī)內(nèi)的東西(字節(jié))轉(zhuǎn)換成人類理解的東西(文字).
編碼:字符到字節(jié)的轉(zhuǎn)換
解碼:字節(jié)到字符的轉(zhuǎn)換
把這兩個(gè)過程運(yùn)用到文件的讀取中更好理解沈撞。計(jì)算機(jī)讀取文本和寫入文本的方式是字節(jié)流慷荔,讀取文件的時(shí)候,把字節(jié)流轉(zhuǎn)換成字符缠俺,實(shí)際上就是解碼過程显晶,同時(shí),將字符寫到文件中去壹士,實(shí)際上就是編碼過程磷雇。
有的人可能說,我怎么記得python中讀取文件的時(shí)候躏救,解碼后的字符都是unicode編碼唯笙,這又是怎么回事?我查了下別人說的優(yōu)勢(shì)盒使,有以下三點(diǎn):
1.可以處理非英文內(nèi)容
2.可以使用第三方庫
3.接收任何的輸入內(nèi)容
相當(dāng)于字節(jié)流解碼變成unicode編碼的字符崩掘,unicode字符作為python內(nèi)部處理通用字符,最后編碼變成其他字符忠怖。
順便提一句呢堰,前面的with方法中無論讀取還是寫入,都是encoding變量后面填參數(shù)凡泣,讀取對(duì)應(yīng)就是解碼方式枉疼,寫入對(duì)應(yīng)編碼方式皮假,python3默認(rèn)編碼方式是utf-8。
關(guān)于unicode的詳細(xì)介紹以及編碼的演變可以點(diǎn)擊下面的鏈接: