# mmap-内存映射文件
# 概述
mmap模块是Python标准库中的一个模块,它提供了一种内存映射文件的方式。操作系统会为访问的文件建立一段虚拟内存,并在需要的时候将相应部分调入内存。
mmap对象支持切片、索引、迭代等操作,也支持文件读写和同步操作,具有很强的灵活性和可扩展性。但是需要注意的是,在使用mmap对象的过程中需要小心处理文件指针,以避免读写文件数据时的错误。
相较于传统的文件读取的方式,这种内存映射的方式更加简单并且更加符合Python的操作习惯。
mmap模块的核心是mmap()函数,它接受一个文件描述符和文件映射模式(如ACCESS_READ、ACCESS_WRITE等),并返回一个mmap对象。通过这个对象,我们可以像访问普通的Python字节数组一样操作文件数据。mmap()函数有以下参数:
-
fileno:表示文件描述符,如果要映射的对象是一个文件,可以使用文件对象的fileno()方法来获取其对应的文件描述符,如果要映射的对象是一个类文件对象,可以直接传递其文件描述符。 -
length:表示映射的内存大小,如果指定为0,则表示映射整个文件。 -
access:表示映射的内存区域的访问权限,包括ACCESS_READ、ACCESS_WRITE和ACCESS_COPY三种模式,分别表示读、写和复制。 -
offset:表示映射的文件偏移量,即从文件的哪个位置开始映射,如果未指定,则从文件的开头开始映射。
# 使用示例
# 读
import mmap
"""
abcdefeg
1234567
lei
"""
# with open('C:\Workspace\Program\CPythonTest\PyTests\example.txt','r') as f:
with open('example.txt', 'r') as f:
with mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ) as mm:
# 切片操作
print(mm[:10])
print("###############")
# 索引操作
print(mm[10])
print("###############")
# 迭代操作
for byte in mm[:5]:
print(byte)
"""
b'abcdefeg\r\n'
###############
49
###############
b'a'
b'b'
b'c'
b'd'
b'e'
b'f'
b'e'
b'g'
b'\r'
b'\n'
b'1'
b'2'
b'3'
b'4'
b'5'
b'6'
b'7'
b'\r'
b'\n'
b'l'
b'e'
b'i
"""
# 写
import mmap
# 打开文件并创建mmap对象
with open("example.txt", "r+b") as f:
with mmap.mmap(f.fileno(), 0) as mm:
print(mm[:]) # b'abcdefeg\r\n1234567\r\nlei'
# 在mmap对象上修改文件内容
mm[0:4] = b"1111"
mm.flush()
print(mm[:]) # b'1111efeg\r\n1234567\r\nlei'
# 关闭mmap对象
mm.close()