STR与字节在Python 3字符串中有什么区别?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
Python2的字符串有两种:STR和Unicode, Python3的字符串也有两种:STR和Bytes.Python2的STR相当于Python3的字节,而Unicode相当于Python3的字节。
Python2里面的STR和Unicode是可以混用的,在都是英文字母的时候STR和Unicode没有区别。
而Python3严格区分文本(STR)和二进制数据(字节),文本总是Unicode,用STR类型,二进制数据则用字节类型表示,这样严格的限制也让我们对如何使用它们有了清晰的认识,这是很棒的。
<强> Python2和Python3的区别强>
通过以下代码我们认识以下Python2和Python3的字符串混用情况:
#, Python2中:[1]:拷贝,& # 39;一个# 39;,==,u # 39;一个# 39;[1]:真实 [2]:拷贝,& # 39;一个# 39;,你# 39;拷贝一个# 39;[2]:真实 [3]:拷贝,& # 39;编程& # 39;,==,u # 39;编程& # 39;/usr/地方/bin/ipython: 1:, UnicodeWarning:, Unicode equal comparison failed 用convert both arguments 用Unicode 作用;interpreting them as being 不平等# !/usr/bin/pythonOut[3]:假 [4]:拷贝,& # 39;编程& # 39;,拷贝u # 39;编程& # 39;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -UnicodeDecodeError Traceback (most recent  call 最后) & lt; ipython-input-4-7b677a923254>,拷贝;& lt; module> () ——祝辞,1,& # 39;编程& # 39;,拷贝u # 39;编程& # 39; UnicodeDecodeError: & # 39; ascii # 39;, codec 停下来# 39;t decode byte 0 xe7 position 0:拷贝,ordinal not 拷贝射程(128) #,Python3中: [1]:拷贝,& # 39;一个# 39;,==,b # 39;一个# 39;[1]:假 [2]:拷贝,& # 39;一个# 39;,b # 39;拷贝一个# 39;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -TypeError Traceback (most recent  call 最后) & lt; ipython-input-10-ca907fd8856f>,拷贝;& lt; module> () - - - - -祝辞,1,& # 39;一个# 39;,b # 39;拷贝一个# 39; TypeError: a bytes-like  object is ,, not & # 39; str # 39;
以上代码可以看的到,Python2中str和Unicode在都是ASCII码时混用没区别,因为Unicode的ASCII区域的值跟str的ASCII是一样的;而对应非ASCII区域(比如中文),二者又不一样了。
可以看到Python2抛出了Unicode解码错误的异常,相信这也是很多人处理文本时遇到过的错误;“编程& # 39;在str类型时长度是6,而在Unicode时是2。不同字符的不同表现,让Python2的str和Unicode显得扑朔迷离。
在Python3中,严格区分了str和字节,不同类型之间操作就会抛出类型错误的异常。
上面用示例阐述了Python2和Python3中字符串的不同,下面主要讲Python3中的字符串。
<强> str和字节之间的转换强>
一图胜千言:
str和字节的相互转换
str.encode(“编码# 39;),→,字节 bytes.decode(“编码# 39;),→,str
编码指的是具体的编码规则的名称,对于中文来说,它可以是这些值:“utf - 8 # 39;,“gb2312 # 39;‘gbk # 39;,“繁体# 39;等等。
不知道你有没有注意到上图中str矩形要比字节矩形短,表示同样的内容,str的长度要小于或等于字节的长度,你可以考虑一下原因(参考Unicode, utf - 8的编码规则)。
下面看看具体代码理解一下str和字节的相互转换:
拷贝[16]:,a =, & # 39; T恤& # 39;[17]:拷贝一个 出[17]:& # 39;T恤& # 39;[18]:拷贝,len (a) 出[18]:2[19]:拷贝,b =, a.encode (& # 39; use utf8 # 39;) 拷贝;[20]:b 出[20]:b # 39; T \ xe6 \ x81 \ xa4& # 39;[21]:拷贝a ==, b 出[21]:FalseIn [22]:, c =, a.encode (& # 39; gbk # 39;) 拷贝;[23]:c 出[23]:b # 39; T \ xd0 \ xf4& # 39;[24]:拷贝b ==, c 出[24]:FalseIn [25]: a ==, c [25]:,假
上面str和字节之间的转换是针对文本内容的,要是其它二进制内容(比如,图片)时,字节就不能解码成str了,看以下代码的异常:
拷贝[29]:,img =,开放(& # 39;str-bytes.jpg& # 39;,, & # 39; rb # 39;) .read () [30]:拷贝,类型(img) [30]:字节 [31]:拷贝,img.decode (& # 39; use utf8 # 39;) --------------------------------------------------------------------------- UnicodeDecodeError Traceback (most recent  call 最后) & lt; ipython-input-31-c9e28f45be95>,拷贝;& lt; module>()——祝辞,1,img.decode (& # 39; use utf8 # 39;) UnicodeDecodeError:, & # 39; utf - 8 # 39;, codec 停下来# 39;t decode byte 0 xff position 0:拷贝,invalid start 字节STR与字节在Python 3字符串中有什么区别