Python編碼規(guī)范擺脫P(yáng)ython編碼噩夢(mèng)_第1頁(yè)
Python編碼規(guī)范擺脫P(yáng)ython編碼噩夢(mèng)_第2頁(yè)
Python編碼規(guī)范擺脫P(yáng)ython編碼噩夢(mèng)_第3頁(yè)
Python編碼規(guī)范擺脫P(yáng)ython編碼噩夢(mèng)_第4頁(yè)
Python編碼規(guī)范擺脫P(yáng)ython編碼噩夢(mèng)_第5頁(yè)
已閱讀5頁(yè),還剩2頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第Python編碼規(guī)范擺脫P(yáng)ython編碼噩夢(mèng)1.Python3中str與bytes2.Python2中str與unicode3.如何檢測(cè)對(duì)象的編碼4.編碼與解碼的區(qū)別5.如何設(shè)置文件編碼

博客原文:/en/latest/c01/c01_44.html

Github:/iswbm/PythonCodingTime

Python中編碼問(wèn)題,一直是很多Python開(kāi)發(fā)者的噩夢(mèng),盡管你是工作多年的Python開(kāi)發(fā)者,也肯定會(huì)經(jīng)常遇到令人神煩的編碼問(wèn)題,好不容易花了半天搞明白了。

一段時(shí)間后,又全都忘光光了,一臉懵逼的你又開(kāi)始你找各種博客、帖子,從頭搞清楚什么是編碼?什么是unicode?它和ASCII有什么區(qū)別?為什么decodeencode老是報(bào)錯(cuò)?python2里和python3的字符串類型怎么都不一樣,怎么對(duì)應(yīng)起來(lái)?如何檢測(cè)編碼格式?

反反復(fù)復(fù),這個(gè)過(guò)程真是太痛苦了。

今天我把大家在Python上會(huì)遇到的一些編碼問(wèn)題都講清楚了,以后你可以不用再Google,收藏這篇文章就行。

1.Python3中str與bytes

在Python3中,字符串有兩種類型,str和bytes。

今天就來(lái)說(shuō)一說(shuō)這二者的區(qū)別:

unicodestring(str類型):以Unicodecodepoints形式存儲(chǔ),人類認(rèn)識(shí)的形式

bytestring(bytes類型):以byte形式存儲(chǔ),機(jī)器認(rèn)識(shí)的形式

在Python3中你定義的所有字符串,都是unicodestring類型,使用type和isinstance可以判別

#python3

str_obj="你好"

type(str_obj)

class'str'

isinstance("你好",str)

isinstance("你好",bytes)

False

而bytes是一個(gè)二進(jìn)制序列對(duì)象,你只要你在定義字符串時(shí)前面加一個(gè)b,就表示你要定義一個(gè)bytes類型的字符串對(duì)象。

#python3

byte_obj=b"HelloWorld!"

type(byte_obj)

class'bytes'

isinstance(byte_obj,str)

False

isinstance(byte_obj,bytes)

但是在定義中文字符串時(shí),你就不能直接在前面加b了,而應(yīng)該使用encode轉(zhuǎn)一下。

byte_obj=b"你好"

File"stdin",line1

SyntaxError:bytescanonlycontainASCIIliteralcharacters.

str_obj="你好"

str_obj.encode("utf-8")

b'\xe4\xbd\xa0\xe5\xa5\xbd'

2.Python2中str與unicode

而在Python2中,字符串的類型又與Python3不一樣,需要仔細(xì)區(qū)分。

在Python2里,字符串也只有兩種類型,unicode和str。

只有unicodeobject和非unicodeobject(其實(shí)應(yīng)該叫strobject)的區(qū)別:

unicodestring(unicode類型):以Unicodecodepoints形式存儲(chǔ),人類認(rèn)識(shí)的形式bytestring(str類型):以byte形式存儲(chǔ),機(jī)器認(rèn)識(shí)的形式

當(dāng)我們直接使用雙引號(hào)或單引號(hào)包含字符的方式來(lái)定義字符串時(shí),就是str字符串對(duì)象,比如這樣

#python2

str_obj="你好"

type(str_obj)

type'str'

str_obj

'\xe4\xbd\xa0\xe5\xa5\xbd'

isinstance(str_obj,bytes)

isinstance(str_obj,str)

isinstance(str_obj,unicode)

False

strisbytes

而當(dāng)我們?cè)陔p引號(hào)或單引號(hào)前面加個(gè)u,就表明我們定義的是unicode字符串對(duì)象,比如這樣

#python2

unicode_obj=u"你好"

unicode_obj

u'\u4f60\u597d'

type(unicode_obj)

type'unicode'

isinstance(unicode_obj,bytes)

False

isinstance(unicode_obj,str)

False

isinstance(unicode_obj,unicode)

3.如何檢測(cè)對(duì)象的編碼

所有的字符,在unicode字符集中都有對(duì)應(yīng)的編碼值(英文叫做:codepoint)

而把這些編碼值按照一定的規(guī)則保存成二進(jìn)制字節(jié)碼,就是我們說(shuō)的編碼方式,常見(jiàn)的有:UTF-8,GB2312等。

也就是說(shuō),當(dāng)我們要將內(nèi)存中的字符串持久化到硬盤中的時(shí)候,都要指定編碼方法,而反過(guò)來(lái),讀取的時(shí)候,也要指定正確的編碼方法(這個(gè)過(guò)程叫解碼),不然會(huì)出現(xiàn)亂碼。

那問(wèn)題就來(lái)了,當(dāng)我們知道了其對(duì)應(yīng)的編碼方法,我們就可以正常解碼,但并不是所有時(shí)候我們都能知道應(yīng)該用什么編碼方式去解碼?

這時(shí)候就要介紹到一個(gè)python的庫(kù)–chardet,使用它之前需要先安裝

python3-mpipinstallchardet

chardet有一個(gè)detect方法,可以預(yù)測(cè)其其編碼格式

importchardet

chardet.detect('微信公眾號(hào):Python編程時(shí)光'.encode('gbk'))

{'encoding':'GB2312','confidence':0.99,'language':'Chinese'}

為什么說(shuō)是預(yù)測(cè)呢,通過(guò)上面的輸出來(lái)看,你會(huì)看到有一個(gè)confidence字段,其表示預(yù)測(cè)的可信度,或者說(shuō)成功率。

但是使用它時(shí),若你的字符數(shù)較少,就有可能“誤診”),比如只有中文兩個(gè)字,就像下面這樣,我們是使用gbk編碼的,使用chardet卻識(shí)別成KOI8-R編碼。

str_obj="中文"

byte_obj=bytes(a,encoding='gbk')#先得到一個(gè)gbk編碼的bytes

chardet.detect(byte_obj)

{'encoding':'KOI8-R','confidence':0.682639754276994,'language':'Russian'}

str_obj2=str(byte_obj,encoding='KOI8-R')

str_obj2

'жпнд'

所以為了編碼診斷的準(zhǔn)確,要盡量使用足夠多的字符。

chardet支持多國(guó)的語(yǔ)言,從官方文檔中可以看到支持如下這些語(yǔ)言(https://chardet.readthedocs.io/en/latest/supported-encodings.html)

4.編碼與解碼的區(qū)別

編碼和解碼,其實(shí)就是str與bytes的相互轉(zhuǎn)化的過(guò)程(Python2已經(jīng)遠(yuǎn)去,這里以及后面都只用Python3舉例)

編碼:encode方法,把字符串對(duì)象轉(zhuǎn)化為二進(jìn)制字節(jié)序列

解碼:decode方法,把二進(jìn)制字節(jié)序列轉(zhuǎn)化為字符串對(duì)象

那么假如我們真知道了其編碼格式,如何來(lái)轉(zhuǎn)成unicode呢?

有兩種方法

第一種是,直接使用decode方法

byte_obj.decode('gbk')

第二種是,使用str類來(lái)轉(zhuǎn)

str_obj=str(byte_obj,encoding='gbk')

str_obj

5.如何設(shè)置文件編碼

在Python2中,默認(rèn)使用的是ASCII編碼來(lái)讀取的,因此,我們?cè)谑褂肞ython2的時(shí)候,如果你的python文件里有中文,運(yùn)行是會(huì)報(bào)錯(cuò)的。

SyntaxError:Non-ASCIIcharacter'\xe4'infiledemo.py

原因就是ASCII編碼表太小,無(wú)法解釋中文。

而在Python3中,默認(rèn)使用的是uft-8來(lái)讀取,所以省了不少的事。

對(duì)于這個(gè)問(wèn)題,通常解決方法有兩種:

第一種方法

在python2中,可以使用在頭部指定

可以這樣寫(xiě),雖然很好看

#-*-coding:utf-8-*-

但這樣寫(xiě)太麻煩了,我通常使用下面兩種寫(xiě)法

#coding:utf-8

#coding=utf-8

第二種方法

importsys

reload(sys)

sys.setdefaultencoding('utf-8')

這里在調(diào)用sys.setdef

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論