当你将一个文件对象读到一个python程序中并想要修改时,可以通过两种方式来完成。第一种方式是修改文件所在物理存储驱动器中的内容,第二种方式是直接在系统的内存或Ram中进行修改。在本文中,我们将看到如何使用 Python 中可用的 mmap 模块读取、搜索和修改文件对象的内容。内存映射不是通过系统调用(例如 open、read 和 lseek)来操作文件,而是将文件的数据放入内存中,从而允许您直接操作内存中的文件。
在下面的例子中,我们一次将一个完整的文件读入内存,并将其作为文件对象保存在内存中。然后我们以读取模式访问它。最后,如您所见,整个文件代表一个对象,我们从中切片某些位置以获得所需的文本。
import mmap def read_mmap(fname): with open(fname, mode="r", encoding="utf8") as fobj: with mmap.mmap(fobj.fileno(), length=0, access=mmap.ACCESS_READ) as mmap_obj: print(mmap_obj[4:26]) read_mmap('E:\\test.txt')
运行上面的代码给我们以下结果 -
'emissions from gaseous'
import mmap import time def regular_io_find(fname): with open(fname, mode="r", encoding="utf-8") as fobj: text = fobj.read() text.find("Death ") def mmap_io_find(fname): with open(fname, mode="r", encoding="utf-8") as fobj: with mmap.mmap(fobj.fileno(), length=0, access=mmap.ACCESS_READ) as mmap_obj: mmap_obj.find(b"Death ") start_time_r = time.time() regular_io_find('E:\\emissions.txt') end_time_r = time.time() print("Regualr read start time :",start_time_r) print("Regualr read start time :",end_time_r) print('Regular read time : {0}'.format(end_time_r - start_time_r)) start_time_m = time.time() mmap_io_find('E:\\emissions.txt') end_time_m = time.time() print("mmap read start time :",start_time_m) print("mmap read start time :",end_time_m) print('mmap read time : {0}'.format(end_time_m - start_time_m))
运行上面的代码给我们以下结果 -
2013 Regualr read start time : 1609812463.2718163 Regualr read end time : 1609812463.2783241 Regular read time to find: 0.00650787353515625 mmap read start time : 1609812463.2783241 mmap read start time : 1609812463.2783241 mmap read time to find : 0.0
在下面的示例中,我们获取一个文件并使用 mmap 模块打开它,访问代码为 r+ 允许读取和写入文件。创建文件对象后,我们通过切片来选择可以写入字符串的位置。
import mmap def mmap_io_write(fname): with open(fname, mode="r+") as fobj: with mmap.mmap(fobj.fileno(), length=0, access=mmap.ACCESS_WRITE) as mmap_obj: mmap_obj[20:26] = b"Hello!" mmap_obj.flush() mmap_io_write('E:\\emissions.txt')
在运行上面的代码时,我们可以打开文件并看到字符串 Hello! 写入文件的字节位置为 20 到 26。