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

2017-11-07  本文已影响0人  小蜗牛的成长

继续

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)
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() 填充已存在的缓冲区而不是为新对象重新分配内存再返回它们.

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

上一篇 下一篇

猜你喜欢

热点阅读