电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

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

瀏覽:4日期: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 編程
相關文章:
主站蜘蛛池模板: 广州监控安装公司_远程监控_安防弱电工程_无线wifi覆盖_泉威安防科技 | 合肥宠物店装修_合肥宠物美容院装修_合肥宠物医院设计装修公司-安徽盛世和居装饰 | 上海盐水喷雾试验机_两厢式冷热冲击试验箱-巨怡环试 | 布袋式除尘器|木工除尘器|螺旋输送机|斗式提升机|刮板输送机|除尘器配件-泊头市德佳环保设备 | 阀门智能定位器_电液动执行器_气动执行机构-赫尔法流体技术(北京)有限公司 | 艺术涂料|木纹漆施工|稻草漆厂家|马来漆|石桦奴|水泥漆|选加河南天工涂料 | 粘度计维修,在线粘度计,二手博勒飞粘度计维修|收购-天津市祥睿科技有限公司 | 欧盟ce检测认证_reach检测报告_第三方检测中心-深圳市威腾检验技术有限公司 | 广州番禺搬家公司_天河黄埔搬家公司_企业工厂搬迁_日式搬家_广州搬家公司_厚道搬迁搬家公司 | 上海质量认证办理中心| 润东方环保空调,冷风机,厂房车间降温设备-20年深圳环保空调生产厂家 | 连栋温室大棚建造厂家-智能玻璃温室-薄膜温室_青州市亿诚农业科技 | 南昌旅行社_南昌国际旅行社_南昌国旅在线| 北京康百特科技有限公司-分子蒸馏-短程分子蒸馏设备-实验室分子蒸馏设备 | 锯边机,自动锯边机,双面涂胶机-建业顺达机械有限公司 | 杭州翻译公司_驾照翻译_专业人工翻译-杭州以琳翻译有限公司官网 组织研磨机-高通量组织研磨仪-实验室多样品组织研磨机-东方天净 | ?水马注水围挡_塑料注水围挡_防撞桶-常州瑞轩水马注水围挡有限公司 | 户外-组合-幼儿园-不锈钢-儿童-滑滑梯-床-玩具-淘气堡-厂家-价格 | 焊管生产线_焊管机组_轧辊模具_焊管设备_焊管设备厂家_石家庄翔昱机械 | 有机肥设备生产制造厂家,BB掺混肥搅拌机、复合肥设备生产线,有机肥料全部加工设备多少钱,对辊挤压造粒机,有机肥造粒设备 -- 郑州程翔重工机械有限公司 | 六维力传感器_三维力传感器_二维力传感器-南京神源生智能科技有限公司 | 有声小说,听书,听小说资源库-听世界网 | 越南专线物流_东莞国际物流_东南亚专线物流_行通物流 | 济南侦探调查-济南调查取证-山东私家侦探-山东白豹调查咨询公司 密集架|电动密集架|移动密集架|黑龙江档案密集架-大量现货厂家销售 | 散热器-电子散热器-型材散热器-电源散热片-镇江新区宏图电子散热片厂家 | 上海公司注册-代理记账-招投标审计-上海昆仑扇财税咨询有限公司 上海冠顶工业设备有限公司-隧道炉,烘箱,UV固化机,涂装设备,高温炉,工业机器人生产厂家 | 石英粉,滑石粉厂家,山东滑石粉-莱州市向阳滑石粉有限公司 | 北京网站建设公司_北京网站制作公司_北京网站设计公司-北京爱品特网站建站公司 | 精密模具制造,注塑加工,吹塑和吹瓶加工,EPS泡沫包装生产 - 济南兴田塑胶有限公司 | 天津仓储物流-天津电商云仓-天津云仓一件代发-博程云仓官网 | 润滑脂-高温润滑脂-轴承润滑脂-食品级润滑油-索科润滑油脂厂家 | 发电机价格|发电机组价格|柴油发电机价格|柴油发电机组价格网 | 印刷人才网 印刷、包装、造纸,中国80%的印刷企业人才招聘选印刷人才网! | 碳化硅,氮化硅,冰晶石,绢云母,氟化铝,白刚玉,棕刚玉,石墨,铝粉,铁粉,金属硅粉,金属铝粉,氧化铝粉,硅微粉,蓝晶石,红柱石,莫来石,粉煤灰,三聚磷酸钠,六偏磷酸钠,硫酸镁-皓泉新材料 | 深圳离婚律师咨询「在线免费」华荣深圳婚姻律师事务所专办离婚纠纷案件 | 小青瓦丨古建筑瓦丨青瓦厂家-宜兴市徽派古典建筑材料有限公司 | 顶呱呱交易平台-行业领先的公司资产交易服务平台 | 卫生型双针压力表-高温防腐差压表-安徽康泰电气有限公司 | 气力输送_输送机械_自动化配料系统_负压吸送_制造主力军江苏高达智能装备有限公司! | 粘度计NDJ-5S,粘度计NDJ-8S,越平水分测定仪-上海右一仪器有限公司 | 带式过滤机厂家_价格_型号规格参数-江西核威环保科技有限公司 |