這篇文章將為大家詳細(xì)講解有關(guān)Python3中編碼與解碼之Unicode與bytes的示例分析,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
Python爬蟲(chóng),下載一個(gè)網(wǎng)頁(yè),然后把所有內(nèi)容寫(xiě)入一個(gè)txt文件中,出現(xiàn)錯(cuò)誤;
TypeError: write() argument must be str, not bytes
AttributeError: 'URLError' object has no attribute 'code'
UnicodeEncodeError: 'gbk' codec can't encode character '\xa0' inposition 5747: illegal multibyte sequence
一看就是編碼問(wèn)題,不懂,度娘上面這方面講得不多,感覺(jué)沒(méi)說(shuō)清楚,自己研究了一晚上,摸出了一點(diǎn)門道。
從頭說(shuō)起,由于各國(guó)語(yǔ)言文字不同,起初要在計(jì)算機(jī)中表示,就有了各種各樣的編碼(例如中文的gb2312)。但是這樣就出現(xiàn)了兼容性的問(wèn)題,所以就有了Unicode,也就是所謂的萬(wàn)國(guó)碼,python3中字符串類型str就是以Unicode編碼格式編碼,所以我們?cè)赑ython3 中看到多種語(yǔ)言文字的字符串而不會(huì)出現(xiàn)亂碼。
編碼是一種用一種特定的方式對(duì)抽象字符(Unicode)轉(zhuǎn)換為二進(jìn)制形式(bytes)進(jìn)行表示,也就是python3中的encode。解碼就是對(duì)用特定方式表示的二進(jìn)制數(shù)據(jù)用特定的方式轉(zhuǎn)化為Unicode,也就是decode。
下圖就是編碼的核心:
一、字符的編碼:
Python對(duì)于bites類型的數(shù)據(jù)用帶‘b‘前綴的單引號(hào)活雙引號(hào)表示。
下面關(guān)于字符編碼解碼的代碼很好的解釋了上面的流程圖:
s='你好' print(s)#輸出結(jié)果:你好 print(type(s))#輸出結(jié)果:<class 'str'> s=s.encode('UTF-8') print(s)#輸出結(jié)果:b'\xe4\xbd\xa0\xe5\xa5\xbd' print(type(s))#輸出結(jié)果:<class 'bytes'> s=s.decode('UTF-8') print(s)#輸出結(jié)果:你好 print(type(s))#輸出結(jié)果:<class 'str'>
多說(shuō)一句,如果你對(duì)str類型字符進(jìn)行decode會(huì)報(bào)錯(cuò),同理,對(duì)bytes類型進(jìn)行encode也會(huì)報(bào)錯(cuò)。
二、文件編碼
在python 3 中字符是以Unicode的形式存儲(chǔ)的,當(dāng)然這里所說(shuō)的存儲(chǔ)是指存儲(chǔ)在計(jì)算機(jī)內(nèi)存當(dāng)中,如果是存儲(chǔ)在硬盤里,Python 3的字符是以bytes形式存儲(chǔ),也就是說(shuō)如果要將字符寫(xiě)入硬盤,就必須對(duì)字符進(jìn)行encode。對(duì)上面這段話再解釋一下,如果要將str寫(xiě)入文件,如果以‘w'模式寫(xiě)入,則要求寫(xiě)入的內(nèi)容必須是str類型;如果以‘wb'形式寫(xiě)入,則要求寫(xiě)入的內(nèi)容必須是bytes類型。文章開(kāi)頭出現(xiàn)的集中錯(cuò)誤,就是因?yàn)閷?xiě)入模式與寫(xiě)入內(nèi)容的數(shù)據(jù)類型不匹配造成的。
s1 = '你好' #如果是以‘w'的方式寫(xiě)入,寫(xiě)入前一定要進(jìn)行encoding,否則會(huì)報(bào)錯(cuò) with open('F:\\1.txt','w',encoding='utf-8') as f1: f1.write(s1) s2 = s1.encode("utf-8")#轉(zhuǎn)換為bytes的形式 #這時(shí)候?qū)懭敕绞揭欢ㄒ恰畐b',且一定不能加encoding參數(shù) with open('F:\\2.txt','wb') as f2: f2.write(s2)
有的人會(huì)問(wèn),我在系統(tǒng)里面用文本編輯器打開(kāi)以bytes形式寫(xiě)入的2.txt文件,發(fā)現(xiàn)里面顯示的是‘你好',而不是‘b'\xe4\xbd\xa0\xe5\xa5\xbd'',因?yàn)槲谋疚臋n打開(kāi)2.txt時(shí),又會(huì)對(duì)它進(jìn)行decode,然后才給你看到。
三、網(wǎng)頁(yè)的編碼
網(wǎng)頁(yè)編碼和文件編碼方法差不多,如下urlopen下載下來(lái)的網(wǎng)頁(yè)read()且用decoding(‘utf-8')解碼,那就必須以‘w'的方式寫(xiě)入文件。如果只是read()而不用encoding(‘utf-8')進(jìn)行編碼,一定要以‘wb'方式寫(xiě)入:
以‘w'方式寫(xiě)入時(shí):
response= url_open('https://www.jb51.net/article/157034.htm ' ,timeout=5 ) #此處以UTF-8方式進(jìn)行解碼,解碼后的數(shù)據(jù)以u(píng)nicode的方式存儲(chǔ)在html中 html = response.read().decode('UTF-8') print(type(html))#輸出結(jié)果:<class 'str'> #這時(shí)寫(xiě)入方式一定要加encoding,以encoding # 即UTF-8的方式對(duì)二進(jìn)制數(shù)據(jù)進(jìn)行編碼才能寫(xiě)入 with open('F:\DownloadAppData\html.txt',"w" , encoding='UTF-8') as f: f.write(html)
以‘wb'方式寫(xiě)入:
response= url_open('https://www.jb51.net/article/157034.htm ' ,timeout=5 ) html = response.read()#此處不需要進(jìn)行解碼,下載下來(lái) print(type(html))#輸出結(jié)果:<class 'bytes'> with open('F:\DownloadAppData\html.txt',"wb" ) as f: f.write(html)
如果要在Python3中,對(duì)urlopen下來(lái)的網(wǎng)頁(yè)進(jìn)行字符搜索,肯定也要進(jìn)行decode,例如使用lxml.etree就必須進(jìn)行decode。
關(guān)于“Python3中編碼與解碼之Unicode與bytes的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
網(wǎng)站題目:Python3中編碼與解碼之Unicode與bytes的示例分析-創(chuàng)新互聯(lián)
當(dāng)前URL:http://aaarwkj.com/article38/dipgsp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航、用戶體驗(yàn)、Google、網(wǎng)站設(shè)計(jì)公司、網(wǎng)站設(shè)計(jì)、營(yíng)銷型網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容