# 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()