继续
-
固件大小记录的文件迭代
在一个固定长度记录或者数据块的集合上迭代,而不是在一个文件中一行一行的迭代。
关键词: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
网友评论