最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python3中編碼與解碼之Unicode與bytes的講解

 更新時(shí)間:2019年02月28日 17:24:29   作者:奧辰_  
今天小編就為大家分享一篇關(guān)于Python3中編碼與解碼之Unicode與bytes的講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧

今天玩Python爬蟲,下載一個(gè)網(wǎng)頁,然后把所有內(nèi)容寫入一個(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

一看就是編碼問題,不懂,度娘上面這方面講得不多,感覺沒說清楚,自己研究了一晚上,摸出了一點(diǎn)門道。

從頭說起,由于各國語言文字不同,起初要在計(jì)算機(jī)中表示,就有了各種各樣的編碼(例如中文的gb2312)。但是這樣就出現(xiàn)了兼容性的問題,所以就有了Unicode,也就是所謂的萬國碼,python3中字符串類型str就是以Unicode編碼格式編碼,所以我們在Python3 中看到多種語言文字的字符串而不會(huì)出現(xiàn)亂碼。

編碼是一種用一種特定的方式對抽象字符(Unicode)轉(zhuǎn)換為二進(jìn)制形式(bytes)進(jìn)行表示,也就是python3中的encode。解碼就是對用特定方式表示的二進(jìn)制數(shù)據(jù)用特定的方式轉(zhuǎn)化為Unicode,也就是decode。

下圖就是編碼的核心:

一、字符的編碼:

Python對于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'>

多說一句,如果你對str類型字符進(jìn)行decode會(huì)報(bào)錯(cuò),同理,對bytes類型進(jìn)行encode也會(huì)報(bào)錯(cuò)。

二、文件編碼

在python 3 中字符是以Unicode的形式存儲(chǔ)的,當(dāng)然這里所說的存儲(chǔ)是指存儲(chǔ)在計(jì)算機(jī)內(nèi)存當(dāng)中,如果是存儲(chǔ)在硬盤里,Python 3的字符是以bytes形式存儲(chǔ),也就是說如果要將字符寫入硬盤,就必須對字符進(jìn)行encode。對上面這段話再解釋一下,如果要將str寫入文件,如果以‘w’模式寫入,則要求寫入的內(nèi)容必須是str類型;如果以‘wb’形式寫入,則要求寫入的內(nèi)容必須是bytes類型。文章開頭出現(xiàn)的集中錯(cuò)誤,就是因?yàn)閷懭肽J脚c寫入內(nèi)容的數(shù)據(jù)類型不匹配造成的。

s1 = '你好'
#如果是以‘w'的方式寫入,寫入前一定要進(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ì)問,我在系統(tǒng)里面用文本編輯器打開以bytes形式寫入的2.txt文件,發(fā)現(xiàn)里面顯示的是‘你好’,而不是‘b'\xe4\xbd\xa0\xe5\xa5\xbd'’,因?yàn)槲谋疚臋n打開2.txt時(shí),又會(huì)對它進(jìn)行decode,然后才給你看到。

三、網(wǎng)頁的編碼

網(wǎng)頁編碼和文件編碼方法差不多,如下urlopen下載下來的網(wǎng)頁read()且用decoding(‘utf-8’)解碼,那就必須以‘w’的方式寫入文件。如果只是read()而不用encoding(‘utf-8’)進(jìn)行編碼,一定要以‘wb’方式寫入:

以‘w’方式寫入時(shí):

response= url_open('http://m.fzitv.net/article/157034.htm ' ,timeout=5 )
#此處以UTF-8方式進(jìn)行解碼,解碼后的數(shù)據(jù)以unicode的方式存儲(chǔ)在html中
html = response.read().decode('UTF-8')
print(type(html))#輸出結(jié)果:<class 'str'>
#這時(shí)寫入方式一定要加encoding,以encoding
# 即UTF-8的方式對二進(jìn)制數(shù)據(jù)進(jìn)行編碼才能寫入
with open('F:\DownloadAppData\html.txt',"w" , encoding='UTF-8') as f:
  f.write(html)

以‘wb’方式寫入:

response= url_open('http://m.fzitv.net/article/157034.htm ' ,timeout=5 )
html = response.read()#此處不需要進(jìn)行解碼,下載下來
print(type(html))#輸出結(jié)果:<class 'bytes'>
with open('F:\DownloadAppData\html.txt',"wb" ) as f:
  f.write(html)

如果要在Python3中,對urlopen下來的網(wǎng)頁進(jìn)行字符搜索,肯定也要進(jìn)行decode,例如使用lxml.etree就必須進(jìn)行decode。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接

相關(guān)文章

  • Python面向?qū)ο缶幊讨嘘P(guān)于類和方法的學(xué)習(xí)筆記

    Python面向?qū)ο缶幊讨嘘P(guān)于類和方法的學(xué)習(xí)筆記

    類與類方法是面向?qū)ο蟮木幊陶Z言中必不可少的特性,本文總結(jié)了Python面向?qū)ο缶幊讨嘘P(guān)于類和方法的學(xué)習(xí)筆記,需要的朋友可以參考下
    2016-06-06
  • Python3之字符串比較_重寫cmp函數(shù)方式

    Python3之字符串比較_重寫cmp函數(shù)方式

    這篇文章主要介紹了Python3之字符串比較_重寫cmp函數(shù)方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Python中比較兩個(gè)字符串操作實(shí)例深究

    Python中比較兩個(gè)字符串操作實(shí)例深究

    本文深入探討Python中字符串比較的多種方法,并通過豐富的示例代碼演示如何靈活運(yùn)用這些技巧,從基本的相等性檢查到更高級的正則表達(dá)式模式匹配,讀者將了解如何利用Python強(qiáng)大的字符串處理功能,提高對字符串?dāng)?shù)據(jù)的操作技能,以解決日常編程任務(wù)中的挑戰(zhàn)
    2023-12-12
  • Python實(shí)時(shí)監(jiān)控網(wǎng)站瀏覽記錄實(shí)現(xiàn)過程詳解

    Python實(shí)時(shí)監(jiān)控網(wǎng)站瀏覽記錄實(shí)現(xiàn)過程詳解

    這篇文章主要介紹了Python實(shí)時(shí)監(jiān)控網(wǎng)站瀏覽記錄實(shí)現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • Python常用數(shù)據(jù)結(jié)構(gòu)和公共方法技巧總結(jié)

    Python常用數(shù)據(jù)結(jié)構(gòu)和公共方法技巧總結(jié)

    這篇文章主要介紹了Python常用數(shù)據(jù)結(jié)構(gòu)和公共方法技巧總結(jié),文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下
    2022-08-08
  • python中cv2模塊安裝詳細(xì)圖文教程

    python中cv2模塊安裝詳細(xì)圖文教程

    在Python中cv2是OpenCV庫的一個(gè)模塊,這是一個(gè)開源的計(jì)算機(jī)視覺和機(jī)器學(xué)習(xí)軟件庫,下面這篇文章主要給大家介紹了關(guān)于python中cv2模塊安裝的相關(guān)資料,需要的朋友可以參考下
    2024-05-05
  • python繪制玫瑰花情人節(jié)表白

    python繪制玫瑰花情人節(jié)表白

    這篇文章主要介紹了python繪制玫瑰花,文章基于python的相關(guān)資料展開主題詳細(xì)介紹,具有一定的參考價(jià)值,想情人節(jié)花式表白的小伙伴可以參考一下喲
    2022-06-06
  • 詳解爬蟲被封的問題

    詳解爬蟲被封的問題

    這篇文章主要介紹了爬蟲被封的問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • python實(shí)現(xiàn)用戶管理系統(tǒng)

    python實(shí)現(xiàn)用戶管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)用戶管理系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • Python閉包之返回函數(shù)的函數(shù)用法示例

    Python閉包之返回函數(shù)的函數(shù)用法示例

    這篇文章主要介紹了 Python閉包之返回函數(shù)的函數(shù)用法示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-01-01

最新評論

海晏县| 苏尼特左旗| 平邑县| 砚山县| 启东市| 得荣县| 孟村| 南丹县| 方正县| 九江市| 石林| 上犹县| 舟曲县| 封开县| 连云港市| 谷城县| 乌海市| 迁西县| 城步| 武强县| 威海市| 文昌市| 惠水县| 长寿区| 沅陵县| 巨野县| 乡城县| 兴山县| 洞头县| 卢龙县| 瓮安县| 盐城市| 固阳县| 夹江县| 南川市| 抚顺县| 宁明县| 图们市| 南华县| 迁安市| 吴江市|