成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

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

瀏覽:3日期:2022-07-09 13:46:00
1 引言

在文件讀寫及字符操作時,我們經常會出現下面這幾種錯誤:

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

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

2 編碼發展史

(1)ASCII編碼

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

(2)GB2312編碼

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

(3)Unicode編碼

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

(4)utf-8編碼

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

3 str與bytes

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

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

>>> s = ’吃飯’>>> type(s)<class ’str’>>>> s1 = s.encode(encoding=’utf-8’)>>> type(s1)<class ’bytes’>>>> s1b’xe5x90x83xe9xa5xad’>>> s2 = s.encode(encoding=’gb2312’)>>> type(s2)<class ’bytes’> >>> s2b’xb3xd4xb7xb9’>>> s1.decode(’utf-8’)’吃飯’>>> s2.decode(’gb2312’)’吃飯’

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

4 文件編碼

在python 3 中字符是以Unicode的形式存儲的,當然這里所說的存儲是指存儲在計算機內存當中,如果是存儲在硬盤里,Python 3的字符是以bytes形式存儲,也就是說如果要將字符寫入硬盤,就必須對字符進行encode。對上面這段話再解釋一下,如果要將str寫入文件,如果以‘w’模式寫入,則要求寫入的內容必須是str類型;如果以‘wb’形式寫入,則要求寫入的內容必須是bytes類型。文章開頭出現的幾種錯誤,就是因為寫入模式與寫入內容的數據類型不匹配造成的。

s1 = ’你好’#如果是以‘w’的方式寫入,寫入前一定要進行encoding,否則會報錯 with open(’F:1.txt’,’w’,encoding=’utf-8’) as f1: f1.write(s1)s2 = s1.encode('utf-8')#轉換為bytes的形式#這時候寫入方式一定要是‘wb’,且一定不能加encoding參數with open(’F:2.txt’,’wb’) as f2: f2.write(s2)

有的人會問,我在系統里面用文本編輯器打開以bytes形式寫入的2.txt文件,發現里面顯示的是‘你好’,而不是‘b’xe4xbdxa0xe5xa5xbd’’,因為文本文檔打開2.txt時,系統會用合適的編碼將其顯示為對應的符號,然后才給你看到。

5 網頁編碼

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

response= url_open(’http://blog.csdn.net/gs_zhaoyang/article/details/13768925 ’ ,timeout=5 )#自定義的一個網頁下載函數#此處以UTF-8方式進行解碼,解碼后的數據以unicode的方式存儲在html中html = response.read().decode(’UTF-8’)print(type(html))#輸出結果:<class ’str’>#這時寫入方式一定要加encoding,以encoding# 即UTF-8的方式對二進制數據進行編碼才能寫入with open(’F:DownloadAppDatahtml.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()#此處不需要進行解碼,下載下來print(type(html))#輸出結果:<class ’bytes’>with open(’F:DownloadAppDatahtml.txt’,'wb' ) as f: f.write(html)

如果要在Python3中,對urlopen下載下來的網頁進行字符操作(例如正則匹配、lxml提?。?,就必須decode成Unicode。

作者:奧辰

微信號:chb1137796095

Github:https://github.com/ChenHuabin321

歡迎加V交流,共同學習,共同進步!

以上就是詳解Python中的編碼問題(encoding與decode、str與bytes)的詳細內容,更多關于python 編碼的資料請關注好吧啦網其它相關文章!

標簽: Python 編程
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
99国产精品久久久久久久久久久| 国产精品―色哟哟| 精品久久五月天| 久久66热re国产| 亚洲欧美99| 亚洲欧美激情视频在线观看一区二区三区| 99久久99久久精品免费观看| 欧美日韩成人高清| 蜜桃视频在线一区| 在线亚洲精品| 亚洲精品中文字幕乱码三区| 欧美视频成人| 国产亚洲一区二区三区四区| 成人精品免费视频| 91精品国产91久久久久久一区二区| 蜜臀av在线播放一区二区三区| 久久精品国产清高在天天线| 亚洲综合一区二区三区| 一本一道久久综合狠狠老精东影业| 国产精品久线在线观看| 欧美在线免费| 久久久综合视频| bt7086福利一区国产| 日韩欧美国产一区二区三区| 久久99热99| 欧美午夜影院一区| 久久66热偷产精品| 欧美日韩久久一区| 国产一区免费电影| 欧美一级片在线| 国产福利不卡视频| 日韩一区二区三区四区五区六区| 国产aⅴ精品一区二区三区色成熟| 91精品国产综合久久久久久久久久| 国产呦精品一区二区三区网站| 在线不卡一区二区| 成人午夜视频在线| 久久网站最新地址| 欧美高清视频一区| 中文字幕免费观看一区| 亚洲国产成人不卡| 亚洲制服丝袜av| 亚洲欧美日韩精品综合在线观看 | 国产精品v一区二区三区| 国产亚洲一本大道中文在线| 欧美黄免费看| 欧美群妇大交群中文字幕| 国产综合色产在线精品| 日韩欧美高清dvd碟片| aaa欧美日韩| 国产精品国产三级国产aⅴ入口| 激情久久婷婷| 一区二区三区丝袜| 色狠狠av一区二区三区| 精品一区二区三区日韩| 日韩美女一区二区三区| 欧美精品九九| 亚洲综合免费观看高清在线观看| 久久久久91| 国产一区二区三区最好精华液| 亚洲精品在线观| 亚洲天堂成人| 午夜视频一区在线观看| 在线视频欧美区| 成人三级伦理片| 国产精品剧情在线亚洲| 在线亚洲观看| 免费视频最近日韩| 日韩一区二区免费在线观看| 91天堂素人约啪| 亚洲黄色在线视频| 欧美少妇一区二区| 91在线观看污| 亚洲午夜影视影院在线观看| 欧美精品自拍偷拍| 国产在线精品二区| 日本三级亚洲精品| 国产亚洲一区二区在线观看| 久久久久久久久久久久久久一区 | 亚洲激情不卡| 蜜臀av在线播放一区二区三区| 久久久久国产一区二区三区四区| 亚洲影视在线| 成人激情开心网| 一区二区三区成人| 日韩欧美国产一区二区三区| 99国产精品久久久久久久| 黑人巨大精品欧美黑白配亚洲| 国产日产精品1区| 在线区一区二视频| 欧美日一区二区三区在线观看国产免| 丝袜脚交一区二区| 久久久一区二区三区| 久久激情久久| 欧美一区二区| 五月婷婷激情综合| 欧美日韩一区二区欧美激情| 欧美在线播放| 日本美女视频一区二区| 欧美v亚洲v综合ⅴ国产v| 国产精品一区视频网站| 精品一区二区免费在线观看| 精品国产网站在线观看| 欧美日本不卡| 亚洲一区日韩精品中文字幕| 精品久久久久久久久久久院品网| 亚洲精品黄色| 精品在线免费视频| 国产日产欧美一区二区视频| 久久国产精品久久久久久电车 | 精品综合免费视频观看| 精品国产伦理网| 最新亚洲一区| 国产一区二区视频在线| 国产精品短视频| 精品视频在线视频| av不卡在线观看| 亚洲1区2区3区视频| 欧美一级一区二区| 欧美日韩久久| 免费在线看成人av| 国产清纯美女被跳蛋高潮一区二区久久w | 中文字幕亚洲电影| 欧美日韩另类一区| 在线视频观看日韩| 久久精品99久久久| 日韩精品在线一区| 国产精品久久久久久模特| 成熟亚洲日本毛茸茸凸凹| 亚洲视频在线观看三级| 欧美精品一级二级| av成人天堂| 成人午夜视频网站| 无吗不卡中文字幕| 久久精品一区二区三区不卡| 在线电影国产精品| 一区二区三区欧美成人| 国产成人在线色| 国产欧美综合在线观看第十页| 亚洲成人1区2区| 欧美xxx在线观看| 6080日韩午夜伦伦午夜伦| 精品国产乱码久久久久久影片| 欧美性猛交xxxx乱大交退制版| 99国产精品久| 老司机精品久久| 国产精品丝袜91| av电影在线观看一区| 激情小说亚洲一区| 亚洲免费观看高清完整版在线观看 | 欧美一区国产二区| 日韩电影在线免费| 国产美女精品| 欧美成人aa大片| 国产亚洲美州欧州综合国| 国产欧美精品一区| 在线成人高清不卡| 亚洲欧美高清| 亚洲丰满在线| av一区二区三区在线| 国产久卡久卡久卡久卡视频精品| 亚洲夂夂婷婷色拍ww47 | 色先锋aa成人| 影音先锋中文字幕一区| 欧美日本不卡| 丁香婷婷综合色啪| 国产精品白丝jk黑袜喷水| 婷婷综合另类小说色区| 亚洲第一综合色| 亚洲国产精品99久久久久久久久| 91精品国产综合久久蜜臀 | 欧美精品日韩精品| 久久久水蜜桃| 在线亚洲伦理| 国产精品xvideos88| 国产成人av影院| 国产精品一区免费视频| 麻豆成人av在线| 性做久久久久久免费观看| 亚洲欧美一区二区不卡| 欧美国产日韩a欧美在线观看 | 成人高清视频免费观看| 免费人成在线不卡| 午夜欧美电影在线观看| 亚洲欧洲日韩在线| 亚洲欧美日韩国产成人精品影院| 中文字幕乱码日本亚洲一区二区| 日韩欧美黄色影院| 7777女厕盗摄久久久| 欧美综合亚洲图片综合区| 91久久黄色| 国产精品99一区二区| 国外成人免费视频| 欧美成人久久| 女女同性精品视频| 91丨九色丨国产丨porny| 岛国精品在线观看| 久久精品国产色蜜蜜麻豆| 国产精品99精品久久免费| 国产在线不卡视频|