• Python中IO编程-StringIO和BytesIO


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

    StringIO

    复制代码
    复制代码
    >>> from io import StringIO
    >>> f = StringIO()
    >>> f.write('hello')
    5
    >>> f.write(' ')
    1
    >>> f.write('world!')
    6
    >>> print(f.getvalue())
    hello world!
    复制代码
    复制代码

    getvalue()方法用于获得写入后的str。

    要读取StringIO,可以用一个str初始化StringIO,然后,像读文件一样读取:

    复制代码
    复制代码
    >>> from io import StringIO
    >>> f = StringIO('Hello!
    Hi!
    Goodbye!')
    >>> while True:
    ...     s = f.readline()
    ...     if s == '':
    ...         break
    ...     print(s.strip())
    ...
    Hello!
    Hi!
    Goodbye!
    复制代码
    复制代码

    BytesIO

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

    BytesIO实现了在内存中读写bytes,我们创建一个BytesIO,然后写入一些bytes:

    复制代码
    复制代码
    >>> from io import BytesIO
    >>> f = BytesIO()
    >>> f.write('中文'.encode('utf-8'))
    6
    >>> print(f.getvalue())
    b'xe4xb8xadxe6x96x87'
    复制代码
    复制代码

    请注意,写入的不是str,而是经过UTF-8编码的bytes。

    和StringIO类似,可以用一个bytes初始化BytesIO,然后,像读文件一样读取:

    >>> from io import BytesIO
    >>> f = BytesIO(b'xe4xb8xadxe6x96x87')
    >>> f.read()
    b'xe4xb8xadxe6x96x87'

    总结

    # stringIO 比如说,这时候,你需要对获取到的数据进行操作,但是你并不想把数据写到本地硬盘上,这时候你就可以用stringIO
    复制代码
    复制代码
    >>> from io import StringIO
    >>> from io import BytesIO
    >>> def outputstring():
        return 'string 
    from 
    outputstring 
    function'
    
    >>> s = outputstring()
    复制代码
    复制代码
    # 将函数返回的数据在内存中读
    >>> sio = StringIO(s)
    # 可以用StringIO本身的方法
    >>> print(sio.getvalue())
    string 
    from 
    outputstring 
    function
    # 也可以用file-like object的方法
    复制代码
    复制代码
    >>> s= sio.readlines()
    >>> for i in s:
        print(i.strip())
    
    >>>string
    from
    outputstring
    function
    复制代码
    复制代码
    # 将函数返回的数据在内存中写
    >>> sio = StringIO()
    >>> sio.write(s)
    36
    # 可以用StringIO本身的方法查看
    复制代码
    复制代码
    >>> s = sio.getvalue()
    >>> print(s)
    string 
    from 
    outputstring 
    function
    复制代码
    复制代码
    # 如果你用file-like object的方法查看的时候,你会发现数据为空
    复制代码
    复制代码
    >>> sio = StringIO()
    >>> sio.write(s)
    36
    >>> for i in sio.readlines():
        print(i.strip())
    
        
    >>> 
    复制代码
    复制代码
    # 这时候我们需要修改下文件的指针位置
    # 我们发现可以打印出内容了
    复制代码
    复制代码
    >>> sio = StringIO()
    >>> sio.write(s)
    36
    >>> sio.seek(0,0)
    0
    >>> print(sio.tell())
    0
    >>> for i in sio.readlines():
        print(i.strip())
    
        
    string
    from
    outputstring
    function
    复制代码
    复制代码
    # 这就涉及到了两个方法seek 和 tell
    # tell 方法获取当前文件读取指针的位置
    # seek 方法,用于移动文件读写指针到指定位置,有两个参数,第一个offset: 偏移量,需要向前或向后的字节数,正为向后,负为向前;第二个whence: 可选值,默认为0,表示文件开头,1表示相对于当前的位置,2表示文件末尾
    # 用seek方法时,需注意,如果你打开的文件没有用'b'的方式打开,则offset无法使用负值哦
    # stringIO 只能操作str,如果要操作二进制数据,就需要用到BytesIO # 上面的sio无法用seek从当前位置向前移动,这时候,我们用'b'的方式写入数据,就可以向前移动了
    复制代码
    复制代码
    >>> bio = BytesIO()
    >>> bio.write(s.encode('utf-8'))
    36
    >>> print(bio.getvalue())
    b'string 
    from 
    outputstring 
    function'
    >>> bio.seek(-36,1)
    0
    >>> print(bio.tell())
    0
    >>> for i in bio.readlines():
          print(i.strip())
    
        
    b'string'
    b'from'
    b'outputstring'
    b'function'
    复制代码
    复制代码

     

     
  • 相关阅读:
    java使用google开源工具实现图片压缩
    MyBatis实现Mysql数据库分库分表操作和总结
    简单记录你博客园的访问人数
    细说spring事务配置属性
    hazelcast初探
    jstorm之于storm
    如何让其他机器访问你的oracle数据库
    问题解决:bash: fork: retry: Resource temporarily unavailable
    分布式锁的几种实现方式
    建立索引的原则总结
  • 原文地址:https://www.cnblogs.com/cangqinglang/p/15125723.html
Copyright © 2020-2023  润新知