python2和python3⾥StringIO和BytesIO的区别
python2⾥StringIO从StringIO模块导⼊,BytesIO从io模块导⼊
在python3⾥StringIO,BytesIO都是从io中导⼊
c++string类型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 ⼀下。
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⽅法。
(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⽂本字符串。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。