python2和python3字符串区别_python2和python3的文本字符串和字节字符串的区别

本文详细解析了Python2和Python3中字符串处理的区别,包括文本字符串和字节字符串的不同。在Python2中,StringIO需为unicode类型,BytesIO需为字节编码类型;而在Python3中,所有字符串均为文本类型str,字节字符串类型为bytes。通过encode和decode方法可以在两者间转换。Python3默认采用Unicode,提供了更好的文本处理支持。
摘要由CSDN通过智能技术生成

@font-face { font-family: "Times New Roman"; }@font-face { font-family: "宋体"; }@font-face { font-family: "-apple-system"; }@font-face { font-family: "verdana"; }p.MsoNormal { margin: 0pt 0pt 0.0001pt; text-align: justify; font-family: "Times New Roman"; font-size: 10.5pt; }p.p { margin: 5pt 0pt; text-align: left; font-family: "Times New Roman"; font-size: 12pt; }span.msoIns { text-decoration: underline; color: blue; }span.msoDel { text-decoration: line-through; color: red; }div.Section0 { }

Python有两种不同的字符串,一种存储文本,一种存储字节。对于文本,Python内部采用Unicode存储,而字节字符串显示原始字节序列或者ASCII。

Python在内存中读写数据,用到的模块是StringIO和BytesIO

StringIO操作的只能是str,如果要操作二进制数据,就需要使用BytesIO。

示例:

a, b = "这不是unicode", u"这是unicode"

c, d = "this is ascii", u"this is not ascii"

python2中:

StringIO必须是文本类型,即unicode类型。

因此StringIO(a)和StringIO(c),都将抛出异常:TypeError: initial_value must be unicode or None, not str

StringIO(b),StringIO(d),都正常,因为它们都是unicode编码。

BytesIO必须是字节编码的类型,即utf-8或ascii或其它编码。

BytesIO(a),BytesIO(c),都正常,因为它们是utf-8和ascii编码。

BytesIO(c),BytesIO(d),都将抛出异常:TypeError: 'unicode' does not have the buffer interface

python3中:

StringIO必须是文本类型,在python3中,即str类型。

StringIO(a),StringIO(b),StringIO(c),StringIO(d),都正常,因为在python3中的str包括python2中的unicode和ascii编码、utf8编码。

BytesIO必须是字节编码的类型,在python3中,必须是bytes类型。

BytesIO(a),BytesIO(b),BytesIO(c),BytesIO(d),都将抛出异常。

要对a,b,c,d编码是bytes,才可使用bytes

aa, bb = "这不是unicode".encode("utf-8"), u"这是unicode".encode("utf-8")

cc,dd = "this is ascii".encode("utf-8"), u"this is not ascii".encode("utf-8")

再对它们进行bytesIO,都正常。

在Python3当中,文本字符串类型(使用Unicode数据存储)被命名为 str , 字节字符串类型被命名为 bytes 。一般情况下,实例化一个字符串会得到一个 str 对象 :

type(a), type(b), type(c), type(d)

(, , , )

所以现在很多人都说,Python3默认是Unicode,也就是这个意思。如果你想得到bytes,那就在文本之前加上前缀 b , 或者 encode 一下。

a.encode(“utf-8”),a.encode(“GBK”),b”这不是unicode”

x,y,z = a.encode("utf-8"), a.encode("GBK"), b"abc"

type(x),type(y),type(z)

(, , )

但是不能,b"中文",将抛出异常:SyntaxError: bytes can only contain ASCII literal characters.

所以,很显然,str 对象有一个encode方法,bytes 对象有一个decode方法。

a.encode("utf-8"), a.encode("GBK"),b.encode("utf-8"),c.encode("utf-8"),d.encode("utf-8")

(b'\xe8\xbf\x99\xe4\xb8\x8d\xe6\x98\xafunicode', b'\xd5\xe2\xb2\xbb\xca\xc7unicode', b'\xe8\xbf\x99\xe6\x98\xafunicode', b'this is ascii', b'this is not ascii')

x.decode("utf8"),y.decode("GBK"),z.decode("utf8")

('这不是unicode', '这不是unicode', 'abc')

在Python3中的 str 对象,是Python2中的unicode;python3中的bytes对象,是python2中的str!!!!!!

在python2中,如果你想得到一个文本字符串,你需要在字符串之前加上前缀 u 或者 decode 一下。

在python2中,如果你想要得到一个字节字符串,你需要在字符串之前,不加前缀u或encode一下。

在python3中,如果你想得到一个文本字符串。不论你是否在字符串前加u,都是文本字符串;或者decode字节字符串。

在python3中,如果你想得到一个字节字符串,你需要在字符串之前,加前缀b(中文字符前不可以直接加b );或者encode文本字符串。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值