????????在學(xué)習(xí)tkinter庫(kù)時(shí)笔时,自己碼了一個(gè)簡(jiǎn)單的文件搜索GUI。具體功能是輸入關(guān)鍵字仗岸、文件類(lèi)型和所要搜索的文件夾路徑允耿,按下搜索按鈕能將相關(guān)的文件的絕對(duì)路徑添加到列表上,雙擊列表所選項(xiàng)能夠打開(kāi)一個(gè)包含文件內(nèi)容的可編輯窗口扒怖。
? ? ? ? 在測(cè)試GUI時(shí)较锡,發(fā)現(xiàn)某些文本文件無(wú)法讀取,出現(xiàn)報(bào)錯(cuò)盗痒。具體為:
當(dāng)執(zhí)行到如下語(yǔ)句時(shí)
f = open('/Users/gy/Desktop/自動(dòng)化1404榮譽(yù)稱(chēng)號(hào).txt','r')? ?#以可讀模式打開(kāi)文件
str1 = f.read()? #讀取文件內(nèi)容
出現(xiàn)報(bào)錯(cuò):
意思就是使用utf-8編碼方式讀取不了文件里的內(nèi)容蚂蕴。
? ? ? ? 這時(shí)候低散,需要查看一下自動(dòng)化1404榮譽(yù)稱(chēng)號(hào).txt文件使用采用何種編碼方式存儲(chǔ)。
原來(lái)自動(dòng)化1404榮譽(yù)稱(chēng)號(hào).txt文件是采用ISO 8859-1編碼方式存儲(chǔ)的骡楼。
? ?????ISO 8859-1屬于單字節(jié)編碼熔号,是沒(méi)有中文對(duì)應(yīng)的編碼,但可以用ISO 8859-1編碼來(lái)"表示"中文鸟整。那么問(wèn)題來(lái)了引镊,為什么這個(gè)文件的內(nèi)容幾乎都是中文,但能用ISO 8859-1編碼方式來(lái)存儲(chǔ)呢篮条?
????????然而GBK編碼和utf-8編碼都支持中文編碼弟头。那么按我的理解,如果一個(gè)文件包含中文涉茧,這個(gè)文件應(yīng)該是剛剛講到的兩種編碼方式之一赴恨,而不應(yīng)該是ISO 8859-1。一般來(lái)說(shuō)伴栓,采用GBK方式編碼一個(gè)中文字用兩個(gè)字節(jié)來(lái)表示伦连,采用GBK方式編碼一個(gè)中文字用三個(gè)字節(jié)來(lái)表示。
????????GBK英文數(shù)字的字符編碼規(guī)則跟ISO 8859-1是一樣的挣饥,所以GBK是兼容ISO 8859-1編碼的,這兩者可以相互轉(zhuǎn)換沛膳。
????????既然讀取不了自動(dòng)化1404榮譽(yù)稱(chēng)號(hào).txt文件內(nèi)容扔枫,這時(shí)用讀取二進(jìn)制模式打開(kāi)自動(dòng)化1404榮譽(yù)稱(chēng)號(hào).txt文件,采用GBK編碼方式進(jìn)行解碼锹安,得到的Unicode碼就能被Python3正確識(shí)別短荐。
f = open('/Users/gy/Desktop/自動(dòng)化1404榮譽(yù)稱(chēng)號(hào).txt','rb')
str1 = f.read().decode('gbk')
????????此時(shí)執(zhí)行編寫(xiě)的文件搜索GUI,能夠正確打開(kāi)含有自動(dòng)化1404榮譽(yù)稱(chēng)號(hào).txt文件內(nèi)容的可編輯窗口叹哭。
????????但是此時(shí)文件搜索GUI只能打開(kāi)以ISO 8859-1方式編碼的文件忍宋,當(dāng)遇到以u(píng)tf-8方式編碼的文件時(shí)還會(huì)報(bào)錯(cuò)。
? ? ? ? 此時(shí)可以利用異常處理來(lái)解決這個(gè)問(wèn)題风罩。
try:
????str1 = f.read().decode('utf-8')
????print('該文件采用UTF-8編碼方式')
except UnicodeDecodeError:
????f.seek(0,0) #作用:重新將文件指針指向文件始端糠排,沒(méi)有這句打開(kāi)GBK編碼的文件會(huì)顯示空白
????str1 = f.read().decode('gbk')
????print('該文件采用GBK編碼方式')
????????為了搞清楚為什么帶中文的文本文件能夠用ISO 8859-1編碼存儲(chǔ)。
? ? ? ? 創(chuàng)建了兩個(gè)不同編碼方式的文本文件超升,分別是文件_GBK.txt采用GBK編碼入宦、文件_UTF-8.txt采用utf-8編碼。再查詢(xún)兩個(gè)文件的編碼方式室琢。
? ? ? ? 可以看到文件_UTF-8.txt是采用utf-8方式編碼存儲(chǔ)的乾闰,文件_GBK.txt是采用ISO 8859-1編碼存儲(chǔ)的。這就解決了為什么帶中文的文本文件能夠用ISO 8859-1編碼存儲(chǔ)的疑問(wèn)盈滴,原來(lái)當(dāng)一個(gè)文本文件采用GBK進(jìn)行編碼時(shí)涯肩,它是以ISO8859-1編碼存儲(chǔ)的。因?yàn)镚BK是兼容ISO 8859-1編碼的,這兩者可以相互轉(zhuǎn)換病苗。