STR与字节在Python 3字符串中有什么区别

  介绍

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与字节在Python 3字符串中有什么区别

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字符串中有什么区别