zoukankan      html  css  js  c++  java
  • 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文本字符串。
    
  • 相关阅读:
    博客园添加访问人数统计【转】
    Android环境下通过C框架层控制WIFI【转】
    用户态文件系统fuse学习【转】
    linux内核 RCU机制详解【转】
    使用diff制作补丁【学习笔记】
    OAuth2授权原理
    Code! MVC 5 App with Facebook, Twitter, LinkedIn and Google OAuth2 Sign-on (C#)
    lock关键字只不过是C#提供的语法糖
    关于OATUH中的AUTHRAZITON CODE和TOKEN的关系,实际上就是这么回事
    SQL Server 索引设计指南
  • 原文地址:https://www.cnblogs.com/nyist-xsk/p/14592658.html
Copyright © 2011-2022 走看看