美文网首页
【2017-11-07】文件与IO(三)

【2017-11-07】文件与IO(三)

作者: 小蜗牛的成长 | 来源:发表于2017-11-07 15:01 被阅读0次

    继续

    • 固件大小记录的文件迭代
      在一个固定长度记录或者数据块的集合上迭代,而不是在一个文件中一行一行的迭代。
      关键词:iter(object, sentinel)、 functools.partial()函数
      iter(object, sentinel) :创建迭代对象,每次调用这个迭代器对象的__next__()方法时,都会调用object。如果__next__的返回值等于sentinel,则抛出StopIteration异常,否则返回下一个值。
      functools.partial(): 利用闭包的特性绑定预先绑定函数及函数参数, 返回一个可调用的变量, 预绑定的函数只有真正的调用才执行
    import functools
    RECORD_SIZE = 2
    with open('test.txt', 'rb') as f:
           records = iter(functools.partial(f.read,RECORD_SIZE), b'')
           for r in records:
                  print(r)
    
    • 读取二进制数据到可变缓冲区中
      你想直接读取二进制数据到一个可变缓冲区中,而不需要做任何的中间复制操作。或者你想原地修改数据并将它写回到一个文件中去。
      关键词:文件对象的readinto()方法
    import os.path
    def read_into_buffer(filename):
        buf = bytearray(os.path.getsize(filename))
        with open(filename, 'rb') as f:
            f.readinto(buf)
        return buf
    

        文件对象的 readinto() 方法能被用来为预先分配内存的数组填充数据,甚至包括由 array 模块或 numpy 库创建的数组。和普通 read() 方法不同的是, readinto() 填充已存在的缓冲区而不是为新对象重新分配内存再返回它们.

    • 内存映射文件
      将文件映射至内存中,并不是直接将文件放入内存中,而是当需要访问时,访问到哪里,就加在那一部分到内存中,因此不占用内存,且拥有内存级别的访问速度
      关键词:mmap模块
      使用mmap.mmap(fileno, length[, flags[, prot[, access[, offset]]]])创建mmap 对象,使用该对象如同使用普通对象
      示例:在一个文件中查找关键字
    import mmap
    import contextlib
    
    word = 'resultSportGPS'
    f = open('123.txt', 'r')
    with contextlib.closing(mmap.mmap(f.fileno(), 0,access=mmap.ACCESS_READ)) as m:
        #也可以通过find(str,pos)来处理
        while True:
            line = m.readline().strip().decode()
            if line.find(word)>=0:
                print ("结果:{}".format(line))
            elif m.tell()==m.size():
                break
            else:
                pass
    

        Python还有另一个读取操作的方法:open中的read、readline、readlines,这个方法是把文件全部载入内存,再进行操作。若内存不足直接用swap或则报错退出,内存消耗和文本大小成正比,而通过mmap模块的方法可以很好的避免了这个问题。
    使用mmap模块,其大致特点如下:
        - 普通文件被映射到虚拟地址空间后,程序可以向访问普通内存一样对文件进行访问,在有些情况下可以提高IO效率。
        - 它占用物理内存空间少,可以解决内存空间不足的问题,适合处理超大文件。
        - 不同于通常的字符串对象,它是可变的,可以通过切片的方式更改,也可以定位当前文件位置m.tell()或m.seek()定位到文件的指定位置,再进行m.write(str)固定长度的修改操作。
    详细使用参考:http://www.cnblogs.com/zhoujinyi/p/6062907.html

    相关文章

      网友评论

          本文标题:【2017-11-07】文件与IO(三)

          本文链接:https://www.haomeiwen.com/subject/bowdmxtx.html