• python同步IO编程——StringIO、BytesIO和stream position


    主要介绍python两个内存读写IO:StringIO和BytesIO,使得读写文件具有一致的接口

    StringIO

    内存中读写str。需要导入StringIO

    >>> from io import StringIO
    >>> f = StringIO()
    >>> f.write('I O U')
    5
    >>> f.getvalue()
    'I O U'

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

    >>> from io import StringIO
    >>> f = StringIO('wc
    love
    LY')
    >>> while 1:
    ...     s = f.readline()
    ...     if s =='':
    ...             break
    ...     print(s.strip())
    ...
    wc
    love
    LY

    BytesIO

    内存中操作二进制数据:

    >>> from io import BytesIO
    >>> f = BytesIO()
    >>> f.write('武松'.encode('utf-8'))
    6
    >>> f.read()
    b''
    >>> f.getvalue()
    b'wcxe6xadxa6xe6x9dxbe'

    细心的童鞋会发现,f.read()竟然为空?!

    这是因为stream position的原因。可以理解为IO的指针位置,可以使用tell()方法获得该值:

    >>> d = StringIO('hehe')
    >>> d.tell()
    0
    >>> d.read()
    'hehe'
    >>> d.tell()
    4
    >>> d.read()
    ''
    >>> d.getvalue()
    'hehe'

    当拟调用诸如read()、readline()、getvalue()方法时,stream position的值是在变化的!当你读取完所有的内容后,指针的位置已经在最后了,此时你再调用read()方法时就为空了。但是可以使用d.getvalue()方法查看内容。

    这时如何调用read()使得结果如我所愿呢,可以结合seek()方法,该方法会重置指针的位置:

    >>> d.seek(3)
    3
    >>> d.read()
    'e'
    >>> d.seek(1)
    1
    >>> d.read()
    'ehe'
  • 相关阅读:
    promise实现(未实现微任务)
    fastclick猜的原理
    js进制
    如何造一个好的组件库【有空就更新】
    BEM的命名
    unicode、utf-32、utf-8、utf-16
    getElementsByTagName、getElementsByClassName与querySelectorAll的区别
    为什么vue中没有事件委托/事件代理的概念
    vscode注释param
    复制dom
  • 原文地址:https://www.cnblogs.com/hiwuchong/p/8613052.html
Copyright © 2020-2023  润新知