日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python3字符编码str_聊聊Python 3 的字符串:str 和 bytes 的区别

發布時間:2025/3/19 python 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python3字符编码str_聊聊Python 3 的字符串:str 和 bytes 的区别 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Python2的字符串有兩種:str 和 unicode,Python3的字符串也有兩種:str 和 bytes。Python2 的 str 相當于 Python3 的bytes,而unicode相當于Python3的str。

Python2里面的str和unicode是可以混用的,在都是英文字母的時候str和unicode沒有區別。而Python3 嚴格區分文本(str)和二進制數據(bytes),文本總是unicode,用str類型,二進制數據則用bytes類型表示,這樣嚴格的限制也讓我們對如何使用它們有了清晰的認識,這是很棒的。

Python2 和 Python3 的區別

通過以下代碼我們認識以下Python2和Python3的字符串混用情況:

#?Python2中:In?[1]:?'a'?==?u'a'Out[1]:?True

In?[2]:?'a'?in?u'a'Out[2]:?True

In?[3]:?'編程'?==?u'編程'/usr/local/bin/ipython:1:?UnicodeWarning:?Unicode?equal?comparison?failed?to?convert?both?arguments?to?Unicode?-?interpreting?them?as?being?unequal#!/usr/bin/pythonOut[3]:?False

In?[4]:?'編程'?in?u'編程'---------------------------------------------------------------------------UnicodeDecodeError?Traceback?(most?recent?call?last)

?in?()

---->?1?'編程'?in?u'編程'

UnicodeDecodeError:?'ascii'?codec?can't?decode?byte?0xe7?in?position?0:?ordinal?not?in?range(128)

#?Python3中:

In?[1]:?'a'?==?b'a'Out[1]:?False

In?[2]:?'a'?in?b'a'---------------------------------------------------------------------------TypeError?Traceback?(most?recent?call?last)

?in?()

---->?1?'a'?in?b'a'

TypeError:?a?bytes-like?object?is?required,?not?'str'

以上代碼可以看到,Python2中str和unicode的在都是ascii碼時混用沒區別,因為unicode的ascii區域的值跟str的ascii是一樣的;而對應非ascii區域(比如中文),二者又不一樣了,可以看到Python2拋出了UnicodeDecodeError的異常,相信這也是很多人處理文本時遇到過的錯誤;‘編程’在str類型時長度是6,而在unicode時是2。不同字符的不同表現,讓Python2的str和unicode顯得撲朔迷離。

在Python3中,嚴格區分了str和bytes,不同類型之間操作就會拋出TypeError的異常。

上面用示例闡述了Python2和Python3中字符串的不同,下面主要講Python3中的字符串。

str和bytes之間的轉換

一圖勝千言:

str和bytes的相互轉換

str.encode(‘encoding’) -> bytes

bytes.decode(‘encoding’) -> str

encoding 指的是具體的編碼規則的名稱,對于中文來說,它可以是這些值: ‘utf-8’, ‘gb2312’, ‘gbk’, ‘big5’ 等等。

不知道你有沒有注意到上圖中str矩形要比bytes矩形短,表示同樣的內容,str的長度要小于或等于bytes的長度,你可以考慮一下原因(參考Unicode、UTF-8的編碼規則)

下面看看具體代碼理解一下str和bytes的相互轉換:

In?[16]:?a?=?'T恤'In?[17]:?a

Out[17]:?'T恤'In?[18]:?len(a)

Out[18]:?2In?[19]:?b?=?a.encode('utf8')

In?[20]:?b

Out[20]:?b'T\xe6\x81\xa4'In?[21]:?a?==?b

Out[21]:?FalseIn?[22]:?c?=?a.encode('gbk')

In?[23]:?c

Out[23]:?b'T\xd0\xf4'In?[24]:?b?==?c

Out[24]:?FalseIn?[25]:?a?==?c

Out[25]:?False

上面str和bytes之間的轉換是針對文本內容的,要是其它二進制內容(比如,圖片)時,bytes就不能decode成str了,看以下代碼的異常:

In?[29]:?img?=?open('str-bytes.jpg',?'rb').read()

In?[30]:?type(img)

Out[30]:?bytes

In?[31]:?img.decode('utf8')

---------------------------------------------------------------------------

UnicodeDecodeError?Traceback?(most?recent?call?last)

?in?()---->?1?img.decode('utf8')UnicodeDecodeError:?'utf-8'?codec?can't?decode?byte?0xff?in?position?0:?invalid?start?byte

因為圖片中的二進制數據不符合文本數據的UTF-8編碼規則。

上面獲得圖片數據時,我們用到了open()來讀取文件,文件存儲的無非是文本和二進制這兩種格式,讀寫文件時也有分清楚編碼:

In?[32]:?open('z.txt',?'w').write('T恤')

Out[32]:?2In?[33]:?open('z.txt',?'w').write(img)

---------------------------------------------------------------------------

TypeError?Traceback?(most?recent?call?last)

?in?()

---->?1?open('z.txt',?'w').write(img)

TypeError:?write()?argument?must?be?str,?not?bytes

In?[34]:?open('z.txt',?'wb').write(img)

Out[34]:?12147

讀寫二進制數據(如圖片)時,要加’rb’參數,b代碼binary(二進制)

讀寫文本數據時,一般加’b’,open()會自動轉換bytes到str。

總結一下

Python3里面的str是在內存中對文本數據進行使用的,bytes是對二進制數據使用的。

str可以encode為bytes,但是bytes不一定可以decode為str。實際上bytes.decode(‘latin1’)可以稱為str,也就是說decode使用的編碼決定了decode()的成敗,同樣的,UTF-8編碼的bytes字符串用GBK去decode()也會出錯。

bytes一般來自網絡讀取的數據、從二進制文件(圖片等)讀取的數據、以二進制模式讀取的文本文件(.txt, .html, .py, .cpp等)

文章首發于我的個人博客,同時我也在

猿人學網站

上寫Python教程

你也可以關注我的個人公眾號:猿人學Python

總結

以上是生活随笔為你收集整理的python3字符编码str_聊聊Python 3 的字符串:str 和 bytes 的区别的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。