欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python中的編碼知識(shí)整理匯總

 更新時(shí)間:2016年01月26日 11:53:15   投稿:hebedich  
這篇文章主要介紹了python中的編碼知識(shí)整理匯總的相關(guān)資料,需要的朋友可以參考下

問題

在平時(shí)工作中,遇到了這樣的錯(cuò)誤:

UnicodeDecodeError: 'ascii' codec can't decode byte

想必大家也都碰到過,很常見 。于是決定對(duì)python的編碼做一個(gè)整理和學(xué)習(xí)。

基礎(chǔ)知識(shí)

在python2.x中,有兩種數(shù)據(jù)類型,unicode和str,這兩個(gè)都是basestring的子類

>>> a = '中'
>>> type(a)
<type 'str'>
>>> isinstance(a,basestring)
True
>>> a = u'中'
>>> type(a)
<type 'unicode'>
>>> isinstance(a,basestring)
True

兩者的區(qū)別,概括來講,str是字節(jié)串,由unicode經(jīng)過編碼(encode)后的字節(jié)組成的(好比與python3.x的byte);unicode是對(duì)象,才是真正意義上的字符串,由字符組成

>>> a='中文'
>>> len(a)
6
>>> repr(a)
"'\\xe4\\xb8\\xad\\xe6\\x96\\x87'"
>>> b=u'中文'
>>> len(b)
2
>>> repr(b)
"u'\\u4e2d\\u6587'"

控制臺(tái)和腳本

在linux下的python控制臺(tái)執(zhí)行以下命令,所得的結(jié)果和執(zhí)行腳本是不同的

>>> a = u'中文'
>>> repr(a)
"u'\\xe4\\xb8\\xad\\xe6\\x96\\x87'"
>>> b = unicode('中文','utf-8')b)
>>> repr(b)
"u'\\u4e2d\\u6587'"

可以看到,u'中文'初始化的對(duì)象a不是我們所期望的,那究竟是什么原因呢?
將python看成是一根管子,管子里頭處理的中間過程都是使用unicode的。入口處,全部轉(zhuǎn)成unicode;出口處,再轉(zhuǎn)成目標(biāo)編碼(當(dāng)然,有例外,處理邏輯中要用到具體編碼的情況)。
在控制臺(tái)執(zhí)行命令a = u'中文',可以將解釋為命令,a = ‘中文'.decode(encode),從而到到unicode對(duì)象a。那么這里的encode是什么呢?對(duì)于控制臺(tái)來說,就是標(biāo)準(zhǔn)輸入,即sys.stdin.encoding

>>> sys.stdin.encoding
'ISO-8859-1'

我的這邊控制臺(tái)默認(rèn)的編碼是ISO-8859-1,故a = u'中文' <=> a = '中文'.decode('ISO-8859-1')
這里的'中文'是控制臺(tái)理解的,即使根據(jù)終端編碼方式編碼后的字節(jié)碼,對(duì)于utf-8編碼的終端,'中文'='\\xe4\\xb8\\xad\\xe6\\x96\\x87'

>>> a='中文'.decode('ISO-8859-1') 
>>> repr(a)
"u'\\xe4\\xb8\\xad\\xe6\\x96\\x87'"

那如何修改此編碼值呢,設(shè)置為什么呢?在linux環(huán)境中設(shè)置環(huán)境變量方法如下,具體設(shè)置什么只要與終端編碼方式一直即可

export PYTHONIOENCODING=UTF-8

總結(jié)

重新回到最初的那個(gè)問題,造成問題的原因是沒有搞清楚unicode和str的區(qū)別,將兩者進(jìn)行了混用。

>>> a = '中文'
>>> a.encode('gbk')
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)

以上的對(duì)象a其實(shí)是str,即字節(jié)碼,若終端是utf-8編碼的話,那么a就是用utf-8 encode的字節(jié)碼。a.encode('gbk') 等價(jià)于a.decode(encoding).encode('gbk'),即先將字節(jié)碼解碼為unicode字符,然后再encode為字節(jié)碼。unicode對(duì)象作為中轉(zhuǎn)站。那么這里的encoding是什么呢?

>>> import sys
>>> sys.getdefaultencoding()
'ascii'

默認(rèn)是ascii,這正是錯(cuò)誤為什么報(bào)無法用ascii解碼的原因

>>> reload(sys)
<module 'sys' (built-in)>
>>> sys.setdefaultencoding('utf-8')
>>> a = '中文'
>>> repr(a)
"'\\xe4\\xb8\\xad\\xe6\\x96\\x87'"
>>> a.encode('gbk')
'\xd6\xd0\xce\xc4'

將默認(rèn)編碼改為utf-8,即可。不鼓勵(lì)對(duì)str使用encode方法,因?yàn)槠渲须[式對(duì)str進(jìn)行了解碼。decode只對(duì)str,encode只對(duì)unicode,一切decode/encode都顯示指定編碼方式。

相關(guān)文章

  • pytorch報(bào)錯(cuò)問題:ValueError: num_samples should be a positive integer value, but got num_samples=0

    pytorch報(bào)錯(cuò)問題:ValueError: num_samples should be

    這篇文章主要介紹了pytorch報(bào)錯(cuò)問題:ValueError: num_samples should be a positive integer value, but got num_samples=0的解決方案,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • python 3.5下xadmin的使用及修復(fù)源碼bug

    python 3.5下xadmin的使用及修復(fù)源碼bug

    xadmin是基于Python和Django的管理框架,想要能夠熟練使用,學(xué)習(xí)Django是必須的。下面這篇文章主要給大家介紹了python 3.5下xadmin的使用和當(dāng)我們重寫了Django的User表后,Django就會(huì)出現(xiàn)bug問題的解決方法,需要的朋友可以參考下。
    2017-05-05
  • 淺談python 讀excel數(shù)值為浮點(diǎn)型的問題

    淺談python 讀excel數(shù)值為浮點(diǎn)型的問題

    今天小編就為大家分享一篇淺談python 讀excel數(shù)值為浮點(diǎn)型的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • Python3.4 tkinter,PIL圖片轉(zhuǎn)換

    Python3.4 tkinter,PIL圖片轉(zhuǎn)換

    我們給大家整理了關(guān)于Python3.4 tkinter,PIL圖片轉(zhuǎn)換的相關(guān)完整代碼,大家可以學(xué)習(xí)測(cè)試下。
    2018-06-06
  • python檢測(cè)是文件還是目錄的方法

    python檢測(cè)是文件還是目錄的方法

    這篇文章主要介紹了python檢測(cè)是文件還是目錄的方法,涉及Python針對(duì)文件及目錄的檢測(cè)技巧,需要的朋友可以參考下
    2015-07-07
  • 使用pandas模塊讀取csv文件和excel表格,并用matplotlib畫圖的方法

    使用pandas模塊讀取csv文件和excel表格,并用matplotlib畫圖的方法

    今天小編就為大家分享一篇使用pandas模塊讀取csv文件和excel表格,并用matplotlib畫圖的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-06-06
  • 更改Python命令行交互提示符的方法

    更改Python命令行交互提示符的方法

    這篇文章主要介紹了更改Python命令行交互提示符的方法,本文還介紹了一款開源軟件iPython和Python的distutils,需要的朋友可以參考下
    2015-01-01
  • python實(shí)現(xiàn)多進(jìn)程并發(fā)控制Semaphore與互斥鎖LOCK

    python實(shí)現(xiàn)多進(jìn)程并發(fā)控制Semaphore與互斥鎖LOCK

    本文主要介紹了python實(shí)現(xiàn)多進(jìn)程并發(fā)控制Semaphore與互斥鎖LOCK,通過實(shí)例來介紹互斥鎖和進(jìn)程并發(fā)控制 semaphore的具體使用,感興趣的同學(xué)可以了解一下
    2021-05-05
  • Python列表切片常用操作實(shí)例解析

    Python列表切片常用操作實(shí)例解析

    這篇文章主要介紹了Python列表切片常用操作實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • python是先運(yùn)行metaclass還是先有類屬性解析

    python是先運(yùn)行metaclass還是先有類屬性解析

    這篇文章主要為大家介紹了python是先運(yùn)行metaclass還是先有類屬性的問題原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05

最新評(píng)論