溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

python3中unicode和bytes的示例分析

發(fā)布時(shí)間:2021-09-03 11:39:55 來源:億速云 閱讀:95 作者:小新 欄目:開發(fā)技術(shù)

這篇文章主要為大家展示了“python3中unicode和bytes的示例分析”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“python3中unicode和bytes的示例分析”這篇文章吧。

寫了一些python3程序,四處能看到bytes類型,而它并不存在于python2中,這也是python3和python2顯著區(qū)別之一。

以前在寫python2代碼的時(shí)候,經(jīng)常會(huì)遇到很多編碼報(bào)錯(cuò)的異常,原因在于python2對(duì)unicode的支持不是特別理想。而在python3中,所有編寫的代碼都是unicode,python解析器在運(yùn)行的時(shí)候,內(nèi)部都轉(zhuǎn)換(除非你顯示定義為bytes類型)為unicode,減少了出錯(cuò)的可能性。

在python3中,有兩種字符串類型,默認(rèn)的就是str,即unicode,也叫做文本類型。但一個(gè)程序總是會(huì)有I/O操作(磁盤,網(wǎng)絡(luò)),即I/O二進(jìn)制數(shù)據(jù),在python3中定義為bytes類型。bytes類型就是一個(gè)個(gè)字節(jié)串,包含0~256 之間的一個(gè)整數(shù)。

那么如何定義bytes類型呢,有兩種顯示的方法,比如:

#只能允許ASCII值
x=b'abc'
y=b'\xe6\x88\x91'
print (x,y)
#對(duì)unicode字符集進(jìn)行特定編碼
t=bytes("我們","UTF-8")
#輸出b'\xe6\x88\x91\xe4\xbb\xac'
#一個(gè)中文字符,UTF-8編碼占用三個(gè)字節(jié)
print (t)
#返回6,對(duì)于python來說,就是字節(jié)序列的長(zhǎng)度
print (len(t))
#返回2,代表兩個(gè)字符
print (len("我們"))

接下去說說str類型和bytes類型之間的轉(zhuǎn)換,比如從網(wǎng)絡(luò)上讀取到二進(jìn)制數(shù)據(jù)后,python需要你顯示的將其轉(zhuǎn)換為str類型,也就是說 python不會(huì)隱式在str和bytes之間轉(zhuǎn)換 ,看上去麻煩了很多,但會(huì)減少你出錯(cuò)的幾率,自己明確自己做要的事情。

如果要將str轉(zhuǎn)換為bytes,必須選擇一個(gè)編碼,明確二進(jìn)制數(shù)據(jù)是如何編碼的,比如:

x="我"
y=x.encode("UTF-8")
z=x.encode("GBK")
#b'\xe6\x88\x91' b'\xce\xd2'
print (y,z)

如果要將bytes轉(zhuǎn)換為str,也需要一個(gè)編碼,必須說明的是,你必須知道 二進(jìn)制數(shù)據(jù)的編碼是什么 ,如果選錯(cuò)了,轉(zhuǎn)換為unicode的時(shí)候會(huì)錯(cuò)誤,另外在python內(nèi)部,它不關(guān)心二進(jìn)制數(shù)據(jù)是什么編碼的,只要是bytes類型, 它就是一串字節(jié)序列 ,比如:

x=b'\xe6\x88\x91'
print (x.decode("UTF-8"))
#會(huì)報(bào)錯(cuò)
print (x.decode("GBK"))

總之一句話,“ python內(nèi)部使用unicode,外部使用bytes類型 ”,python內(nèi)建庫中,很多函數(shù)會(huì)說明需要str類型還是bytes類型(嚴(yán)格說來是bytes-like對(duì)象,比如bytes、bytearray ),在寫代碼的時(shí)候一定要看清楚,比如 hamc 庫的new方法,就要求:

hmac.new(key, msg=None, digestmod=None) key is a bytes or bytearray object giving the secret key

很多庫,尤其第三方庫(比如requests)為了兼容python2和python3,會(huì)在內(nèi)部做很多轉(zhuǎn)換工作,讓你意識(shí)不到bytes類型的存在,雖然生產(chǎn)力提高了,但對(duì)于理解python并沒有太大的好處。

如果要充分理解bytes和str的應(yīng)用,可以參考o(jì)pen和write兩個(gè)內(nèi)建函數(shù)。

使用文本方式打開文件,python在內(nèi)部會(huì)自動(dòng)轉(zhuǎn)換為str類型,比如:

file ="t.txt"
t = open(file,mode="r").read()

而如果是二進(jìn)制方式打開,如果要顯示在終端,需要轉(zhuǎn)換為str類型,比如:

file ="t.txt"
t = open(file,mode="rb").read()
print (t.decode())
print (t,type(t))

而如果是二進(jìn)制方式寫入,則將bytes類型數(shù)據(jù)直接寫入,比如:

file="t.txt"
t=open(file,mode="wb")
t.write(b'\xe6\x88\x91')

在上面幾個(gè)例子中,都沒有說明使用那種編碼,如果不顯示指定,一般編碼等同于locale.getpreferedencoding() 。

以上是“python3中unicode和bytes的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI