zoukankan      html  css  js  c++  java
  • Python3学习笔记23-StringIO和BytesIO

    StringIO

    很多时候数据读取不一定是文件,也可以在内存中

    StringIO顾名思义就是在内存中读写str

    要把str写入StringIO,我们需要先创建一个StringIO,然后像文件一样写入即可:

    from io import StringIO
    f = StringIO()
    f.write('Hello')
    f.write(' ')
    f.write('Word')
    print(f.getvalue())
    #getvalue()方法用于获得写入的str

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

    f = StringIO('Hello!
    Hi!
    Goodbye!')
    while True:
        s = f.readline()#每行读取
        if s == '':#当读取到空
            break#终止读取
        print(s.strip())#strip()去掉首尾空格




    BytesIO

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

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

    from io import BytesIO
    f = BytesIO()
    f.write('中文'.encode('utf-8'))#写入的是经过utf-8编码的bytes
    print(f.getvalue())



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

    f = BytesIO(b'xe4xb8xadxe6x96x87')
    print(f.read())

    注意事项

    指针:可以理解为windows操作界面,操作一个文件时候,比如一个txt文件,鼠标的光标所在的位置

    f = StringIO('abc')#第一次初始化
    print(f.getvalue())
    f = StringIO('asd')#第二次初始化
    print(f.getvalue())

    可以看出来两次值是不一样的,在初始化的时候,是覆盖原值的,指针永远指向0,也就是文件开头位置

    f = StringIO()
    f.write('aaa')#第一次写入
    print(f.getvalue())
    f.write('bbb')#第二次写入
    print(f.getvalue()

    可以看出来,第二次的值是第一次加上第二次,所以write()方法本质是追加

    第一次write的时候,指针是在输入内容后面的

    f = StringIO('xxxxxxx')#第一次初始化
    print(f.getvalue())
    f = StringIO('bbbbbbb')#第二次初始化
    print(f.getvalue())
    f.write('vvvvvv')#第一次写入
    print(f.getvalue())
    f.write('nnnnnn')#第二次写入
    print(f.getvalue())

    通过打印结果可以看出,第一次写入的时候,因为初始化之后的指针是在文件开头的,所以还是覆盖了,但是因为write写入的内容比上一次初始化的内容少,所以还有个b保留了下来,第二次写入的时候因为指针已经在最后面了,所以追加了写入内容



    f = BytesIO(b'aaaabbbbcccc')
    print(f.read())
    print(f.read())
    print(f.getvalue())
    print(f.getvalue())

    getvalue()方法是不管指针在哪,读取所有内容,而file-like Object中的read(),readline(),readlines()方法是需要根据指针所在来进行读取的,所以第一次使用read读取完了之后,光标在文件末尾,所以再次读取,自然读取不到东西



    f = BytesIO()
    f.write(b'asfsgsgs')
    print(f.read())
    print(f.getvalue())

    同样的道理,因为write()方法写入内容后,指针是在文件末尾的,所以用read()等方法是无法读取到数据的

    所以上面两个例子如果想要用read()来读取,需要使用seek()方法改变指针位置

    tell()可以获取当前指针所在位置

    给上面两个例子加上f.seek(0,0)回到文件开头,就能用read()读取到了

    上面所有注意事项在StringIO和BytesIO通用

    除了seek()方法第一次参数为负数,负数表示向前移动,只能在BytesIO中使用

  • 相关阅读:
    C# savefiledialog 保存文件后 再操作数据库 提示数据库文件路径错误
    转:在C#中使用Nullable类型
    转:Global.asax通过Application_BeginRequest()事件实现访问链接的静态地址映射
    DZ7.0自动伸缩广告
    转:使用HttpModule来实现sql的防注入
    转:System.Web.UI.Page类的构造函数的执行时机
    使用ISAPI_Rewrite做简单实用的301重定向
    IIS7添加ASP.NET网站碰到的问题
    IE9 崩溃的解决方法
    利用ZEND Studio与Zend server对PHP WEB进行调试
  • 原文地址:https://www.cnblogs.com/myal/p/9337407.html
Copyright © 2011-2022 走看看