這篇文章主要為大家展示了“python3中unicode和bytes的示例分析”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“python3中unicode和bytes的示例分析”這篇文章吧。
創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供墨玉網(wǎng)站建設(shè)、墨玉做網(wǎng)站、墨玉網(wǎng)站設(shè)計、墨玉網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計與制作、墨玉企業(yè)網(wǎng)站模板建站服務(wù),十年墨玉做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡(luò)服務(wù)。寫了一些python3程序,四處能看到bytes類型,而它并不存在于python2中,這也是python3和python2顯著區(qū)別之一。
以前在寫python2代碼的時候,經(jīng)常會遇到很多編碼報錯的異常,原因在于python2對unicode的支持不是特別理想。而在python3中,所有編寫的代碼都是unicode,python解析器在運行的時候,內(nèi)部都轉(zhuǎn)換(除非你顯示定義為bytes類型)為unicode,減少了出錯的可能性。
在python3中,有兩種字符串類型,默認的就是str,即unicode,也叫做文本類型。但一個程序總是會有I/O操作(磁盤,網(wǎng)絡(luò)),即I/O二進制數(shù)據(jù),在python3中定義為bytes類型。bytes類型就是一個個字節(jié)串,包含0~256 之間的一個整數(shù)。
那么如何定義bytes類型呢,有兩種顯示的方法,比如:
#只能允許ASCII值 x=b'abc' y=b'\xe6\x88\x91' print (x,y) #對unicode字符集進行特定編碼 t=bytes("我們","UTF-8") #輸出b'\xe6\x88\x91\xe4\xbb\xac' #一個中文字符,UTF-8編碼占用三個字節(jié) print (t) #返回6,對于python來說,就是字節(jié)序列的長度 print (len(t)) #返回2,代表兩個字符 print (len("我們"))
接下去說說str類型和bytes類型之間的轉(zhuǎn)換,比如從網(wǎng)絡(luò)上讀取到二進制數(shù)據(jù)后,python需要你顯示的將其轉(zhuǎn)換為str類型,也就是說 python不會隱式在str和bytes之間轉(zhuǎn)換 ,看上去麻煩了很多,但會減少你出錯的幾率,自己明確自己做要的事情。
如果要將str轉(zhuǎn)換為bytes,必須選擇一個編碼,明確二進制數(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,也需要一個編碼,必須說明的是,你必須知道 二進制數(shù)據(jù)的編碼是什么 ,如果選錯了,轉(zhuǎn)換為unicode的時候會錯誤,另外在python內(nèi)部,它不關(guān)心二進制數(shù)據(jù)是什么編碼的,只要是bytes類型, 它就是一串字節(jié)序列 ,比如:
x=b'\xe6\x88\x91' print (x.decode("UTF-8")) #會報錯 print (x.decode("GBK"))
總之一句話,“ python內(nèi)部使用unicode,外部使用bytes類型 ”,python內(nèi)建庫中,很多函數(shù)會說明需要str類型還是bytes類型(嚴格說來是bytes-like對象,比如bytes、bytearray ),在寫代碼的時候一定要看清楚,比如 hamc 庫的new方法,就要求:
hmac.new(key, msg=None, digestmod=None) key is a bytes or bytearray object giving the secret key
很多庫,尤其第三方庫(比如requests)為了兼容python2和python3,會在內(nèi)部做很多轉(zhuǎn)換工作,讓你意識不到bytes類型的存在,雖然生產(chǎn)力提高了,但對于理解python并沒有太大的好處。
如果要充分理解bytes和str的應(yīng)用,可以參考open和write兩個內(nèi)建函數(shù)。
使用文本方式打開文件,python在內(nèi)部會自動轉(zhuǎn)換為str類型,比如:
file ="t.txt" t = open(file,mode="r").read()
而如果是二進制方式打開,如果要顯示在終端,需要轉(zhuǎn)換為str類型,比如:
file ="t.txt" t = open(file,mode="rb").read() print (t.decode()) print (t,type(t))
而如果是二進制方式寫入,則將bytes類型數(shù)據(jù)直接寫入,比如:
file="t.txt" t=open(file,mode="wb") t.write(b'\xe6\x88\x91')
在上面幾個例子中,都沒有說明使用那種編碼,如果不顯示指定,一般編碼等同于locale.getpreferedencoding()
。
以上是“python3中unicode和bytes的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!