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

詳解Python中的編碼問題(encoding與decode、str與bytes)

 更新時(shí)間:2020年09月30日 09:14:04   作者:奧辰  
這篇文章主要介紹了Python中的編碼問題(encoding與decode、str與bytes),幫助大家更好的理解和使用python進(jìn)行開發(fā),感興趣的朋友可以了解下

1 引言

  在文件讀寫及字符操作時(shí),我們經(jīng)常會出現(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

  這些錯(cuò)誤一看就是編碼問題, 本篇博文總結(jié)一下Python3文件讀寫及字符操作中的編碼。

2 編碼發(fā)展史

  (1)ASCII編碼

  眾所周知,計(jì)算機(jī)只能處理0和1,任何符號都轉(zhuǎn)換為0和1的序列才能處理。計(jì)算機(jī)中8個(gè)位(bit)作為一個(gè)字節(jié),所以1個(gè)字節(jié)能產(chǎn)生2的8次方個(gè)0和1的不同組合,也就是說1個(gè)字節(jié)做多能表示256種字符。ASCII編碼就是用1個(gè)字節(jié)來存儲字符,計(jì)算機(jī)最初是美國人發(fā)明的,他們的符號不多,所以還將8個(gè)0和1序列中的第一位固定為0,ASCII只能表示127個(gè)字符。

 ?。?)GB2312編碼

  美國佬的符號不多,所以ASCII編碼夠用,但是其他國家就不行了,每個(gè)國家符號數(shù)量都不一樣,就各自指定了自己的編碼。例如我們中國就制定了GB2312編碼。GB2312編碼用2個(gè)字節(jié)表示一個(gè)字符。

  (3)Unicode編碼

  每個(gè)國家都用自己的編碼,編碼一朵就容易亂套,也沒法交流,所以需要一種編碼把各個(gè)國家的編碼都囊括進(jìn)去,這就是Unicode編碼的由來。所以,Unicode也被稱為萬國碼。Unicode編碼也用2個(gè)字節(jié)存儲一個(gè)字符。

 ?。?)utf-8編碼

Unicode編碼解決了編碼不能通用的問題,但是卻容易浪費(fèi)內(nèi)存,尤其是在存儲英文的時(shí)候,例如一個(gè)字符“A”,ASCII編碼只需要1個(gè)字節(jié)就夠,但是Unicode編碼必須要用2個(gè)字節(jié)。為了解決這一問題,就有了utf-8編碼。 utf-8編碼把存儲英文依舊用一個(gè)字節(jié),漢字就3個(gè)字節(jié)。特別是生僻的編程4-6字節(jié),如果傳輸大量英文,utf-8作用就很明顯了。
utf-8編碼進(jìn)行存儲時(shí)有極大地優(yōu)勢,但是當(dāng)讀取到計(jì)算機(jī)內(nèi)存時(shí)卻不大合適,因?yàn)閡tf-8編碼是變長的,不方便尋址和索引,所以在計(jì)算機(jī)內(nèi)存中,還是轉(zhuǎn)化為Unicode編碼合適些。這就可以解釋為什么每次讀取文本時(shí),要將編碼轉(zhuǎn)化為Unicode編碼,而將內(nèi)存中的字符寫入文件存儲時(shí),要將編碼轉(zhuǎn)化為utf-8了。

3 str與bytes

  在Python3中,文本總是為Unicode編碼,在類型上為str類,也就是說Python編譯器只會把Unicode編碼下的二進(jìn)制流顯示為我們可識別的符號。二進(jìn)制流在Python中也有一個(gè)專門的類用于表示這種二進(jìn)制序列,那就是bytes(在Python中這個(gè)二進(jìn)制序列顯示為16進(jìn)制,但本質(zhì)還是二進(jìn)制)。一個(gè)str在不同的編碼下就可以轉(zhuǎn)化為不同的bytes(二進(jìn)制流),反之,要將bytes轉(zhuǎn)化為可識別的str就必須用對應(yīng)的編碼,否則就會報(bào)錯(cuò)。

用人類語言類比一下:我們要表達(dá)“吃飯”這件事物(str),翻譯為各個(gè)國家的文字后有各不相同的表示,中文表示為“吃飯”,英文表示為“eat”,這就是“吃飯”這個(gè)str在不同編碼寫的表示。但官方只認(rèn)中文(Pythonstr只認(rèn)Unicode編碼),所以就必須把“eat”用英語(編碼)的表示方式轉(zhuǎn)化為中文的“吃飯”(Unicode編碼),官方才會顯示知道是吃飯這件事。

>>> s = '吃飯'
>>> type(s)
<class 'str'>
>>> s1 = s.encode(encoding='utf-8')
>>> type(s1)
<class 'bytes'>
>>> s1
b'\xe5\x90\x83\xe9\xa5\xad'
>>> s2 = s.encode(encoding='gb2312')
>>> type(s2)
<class 'bytes'> 
>>> s2
b'\xb3\xd4\xb7\xb9'
>>> s1.decode('utf-8')
'吃飯'
>>> s2.decode('gb2312')
'吃飯'

4 文件編碼

  在python 3 中字符是以Unicode的形式存儲的,當(dāng)然這里所說的存儲是指存儲在計(jì)算機(jī)內(nèi)存當(dāng)中,如果是存儲在硬盤里,Python 3的字符是以bytes形式存儲,也就是說如果要將字符寫入硬盤,就必須對字符進(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,否則會報(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)

  有的人會問,我在系統(tǒng)里面用文本編輯器打開以bytes形式寫入的2.txt文件,發(fā)現(xiàn)里面顯示的是‘你好',而不是‘b'\xe4\xbd\xa0\xe5\xa5\xbd'',因?yàn)槲谋疚臋n打開2.txt時(shí),系統(tǒng)會用合適的編碼將其顯示為對應(yīng)的符號,然后才給你看到。

5 網(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://blog.csdn.net/gs_zhaoyang/article/details/13768925 ' ,timeout=5 )#自定義的一個(gè)網(wǎng)頁下載函數(shù)
#此處以UTF-8方式進(jìn)行解碼,解碼后的數(shù)據(jù)以unicode的方式存儲在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://blog.csdn.net/gs_zhaoyang/article/details/13768925 ' ,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)行字符操作(例如正則匹配、lxml提取),就必須decode成Unicode。

作者:奧辰

微信號:chb1137796095

Github:https://github.com/ChenHuabin321

歡迎加V交流,共同學(xué)習(xí),共同進(jìn)步!

以上就是詳解Python中的編碼問題(encoding與decode、str與bytes)的詳細(xì)內(nèi)容,更多關(guān)于python 編碼的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python的numpy選擇特定行列的方法

    Python的numpy選擇特定行列的方法

    這篇文章主要介紹了Python的numpy選擇特定行列的方法,有時(shí)需要抽取矩陣中特定行的特定列,比如,需要抽取矩陣x的0,1行的0,3列,結(jié)果為矩陣域,需要的朋友可以參考下
    2023-08-08
  • PyQt5編程擴(kuò)展之資源文件的使用教程

    PyQt5編程擴(kuò)展之資源文件的使用教程

    PyQt5支持Qt的資源系統(tǒng),這是用于在應(yīng)用程序中嵌入圖片和翻譯文件等資源的工具,下面這篇文章主要給大家介紹了關(guān)于PyQt5編程擴(kuò)展之資源文件使用的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-03-03
  • Python根據(jù)成績分析系統(tǒng)淺析

    Python根據(jù)成績分析系統(tǒng)淺析

    在本篇文章里小編給大家分享了關(guān)于Python根據(jù)成績分析是否繼續(xù)深造一個(gè)系統(tǒng)的相關(guān)知識點(diǎn),有需要的朋友們學(xué)習(xí)下。
    2019-02-02
  • python中pandas庫的iloc函數(shù)用法解析

    python中pandas庫的iloc函數(shù)用法解析

    在 Pandas 中,.iloc 是一種用于基于整數(shù)位置進(jìn)行索引的屬性,可以用于獲取 DataFrame 或 Series 中的數(shù)據(jù),這篇文章主要介紹了python中pandas庫的iloc函數(shù)用法,需要的朋友可以參考下
    2023-05-05
  • 使用python執(zhí)行shell腳本 并動(dòng)態(tài)傳參 及subprocess的使用詳解

    使用python執(zhí)行shell腳本 并動(dòng)態(tài)傳參 及subprocess的使用詳解

    這篇文章主要介紹了使用python執(zhí)行shell腳本 并動(dòng)態(tài)傳參 及subprocess的使用詳解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-03-03
  • 跟老齊學(xué)Python之用Python計(jì)算

    跟老齊學(xué)Python之用Python計(jì)算

    做為零基礎(chǔ)學(xué)習(xí)Python,也就從計(jì)算小學(xué)數(shù)學(xué)題目開始吧。因?yàn)閺倪@里開始,數(shù)學(xué)的基礎(chǔ)知識列為肯定過關(guān)了。
    2014-09-09
  • Python中實(shí)現(xiàn)對list做減法操作介紹

    Python中實(shí)現(xiàn)對list做減法操作介紹

    這篇文章主要介紹了Python中實(shí)現(xiàn)對list做減法操作介紹,需要的朋友可以參考下
    2015-01-01
  • 在Django的上下文中設(shè)置變量的方法

    在Django的上下文中設(shè)置變量的方法

    這篇文章主要介紹了在Django的上下文中設(shè)置變量的方法,Django是重多Python高人氣框架中最為著名的一個(gè),需要的朋友可以參考下
    2015-07-07
  • Python用requests模塊實(shí)現(xiàn)動(dòng)態(tài)網(wǎng)頁爬蟲

    Python用requests模塊實(shí)現(xiàn)動(dòng)態(tài)網(wǎng)頁爬蟲

    大家好,本篇文章主要講的是Python用requests模塊實(shí)現(xiàn)動(dòng)態(tài)網(wǎng)頁爬蟲,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-02-02
  • Python3.8.2安裝包及安裝教程圖文詳解(附安裝包)

    Python3.8.2安裝包及安裝教程圖文詳解(附安裝包)

    這篇文章主要介紹了Python3.8.2安裝包及安裝教程圖文詳解,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11

最新評論

科技| 榆社县| 东兴市| 杭锦后旗| 连州市| 修文县| 吴旗县| 张家港市| 修文县| 平安县| 新巴尔虎左旗| 锡林浩特市| 惠州市| 洪江市| 海丰县| 栾川县| 获嘉县| 清水河县| 大宁县| 玛纳斯县| 苗栗县| 阆中市| 沂南县| 阿拉善盟| 务川| 新疆| 海晏县| 嵊泗县| 宣化县| 嘉鱼县| 定兴县| 永德县| 从化市| 隆德县| 神农架林区| 监利县| 敦煌市| 汝南县| 林周县| 肇州县| 邻水|