• python2 和 python3里StringIO和BytesIO的区别


    python2里StringIO从StringIO模块导入,BytesIO从io模块导入
    在python3里StringIO,BytesIO都是从io中导入
    
    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'xe8xbfx99xe4xb8x8dxe6x98xafunicode', b'xd5xe2xb2xbbxcaxc7unicode', b'xe8xbfx99xe6x98xafunicode', 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文本字符串。
    
  • 相关阅读:
    2、容器初探
    3、二叉树:先序,中序,后序循环遍历详解
    Hebbian Learning Rule
    论文笔记 Weakly-Supervised Spatial Context Networks
    在Caffe添加Python layer详细步骤
    论文笔记 Learning to Compare Image Patches via Convolutional Neural Networks
    Deconvolution 反卷积理解
    论文笔记 Feature Pyramid Networks for Object Detection
    Caffe2 初识
    论文笔记 Densely Connected Convolutional Networks
  • 原文地址:https://www.cnblogs.com/nyist-xsk/p/14592658.html
Copyright © 2020-2023  润新知