内存映射文件对象的行为bytearray
类似于 文件对象。您可以在bytearray
预期的大多数地方使用mmap对象; 例如,您可以使用该re
模块搜索内存映射文件。您也可以通过执行更改单个字节,或通过分配切片来更改子序列:。您还可以从当前文件位置开始读取和写入数据,并通过文件读取和写入不同的位置。obj[index] =97
obj[i1:i2] = b'...'
seek()
内存映射文件由mmap
构造函数创建,在Unix和Windows上不同。在任何一种情况下,您都必须为打开以进行更新的文件提供文件描述符。如果要映射现有的Python文件对象,请使用其fileno()
方法获取fileno参数的正确值 。否则,您可以使用os.open()
函数打开文件,该 函数直接返回文件描述符(完成后仍需要关闭文件)。
对于构造函数的Unix和Windows版本,可以将访问指定为可选的关键字参数。access接受四个值中的一个:ACCESS_READ
,, ACCESS_WRITE
或ACCESS_COPY
分别指定只读,直写或写时复制内存,或者 ACCESS_DEFAULT
延迟到prot。 访问可以在Unix和Windows上使用。如果未指定access,则Windows mmap将返回直写映射。所有三种访问类型的初始内存值都取自指定的文件。分配给ACCESS_READ
内存映射会引发TypeError
异常。分配给ACCESS_WRITE
内存映射会影响内存和底层文件。分配到ACCESS_COPY
内存映射会影响内存,但不会更新基础文件。
在版本3.7中更改:添加ACCESS_DEFAULT
常量。
要映射匿名内存,应将-1作为fileno与长度一起传递。
class mmap.
mmap
(fileno,length,tagname = None,access = ACCESS_DEFAULT [,offset ] )
(Windows版)从文件句柄fileno指定的文件中映射长度字节,并创建mmap对象。如果length大于文件的当前大小,则文件将扩展为包含长度 字节。如果length为,则映射的最大长度是文件的当前大小,但如果文件为空,则Windows引发异常(您无法在Windows上创建空映射)。0
tagname,如果指定而不是None
,则是一个字符串,给出映射的标记名称。Windows允许您针对同一文件具有许多不同的映射。如果指定现有标记的名称,则会打开该标记,否则将创建此名称的新标记。如果省略此参数None
,则创建的映射没有名称。避免使用tag参数将有助于保持代码在Unix和Windows之间可移植。
offset可以指定为非负整数偏移量。mmap引用将相对于文件开头的偏移量。offset 默认为0. offset必须是的倍数ALLOCATIONGRANULARITY
。
class mmap.
mmap
(fileno,length,flags = MAP_SHARED,prot = PROT_WRITE | PROT_READ,access = ACCESS_DEFAULT [,offset ] )
(Unix版本)从文件描述符fileno指定的文件中映射长度字节,并返回mmap对象。如果length为,则映射的最大长度将是调用时文件的当前大小 。0
mmap
flags指定映射的性质。MAP_PRIVATE
创建一个私有的写时复制映射,因此对mmap对象内容的更改将对此进程是私有的,并MAP_SHARED
创建一个映射,该映射与映射文件相同区域的所有其他进程共享。默认值为MAP_SHARED
。
PROT,如果指定,得到所需的存储器保护; 两个最有用的值是PROT_READ
和PROT_WRITE
,以指定可以读取或写入页面。 prot默认为 。PROT_READ | PROT_WRITE
可以指定访问来代替flags和prot作为可选的关键字参数。指定flags,prot和 access都是错误的。有关如何使用此参数的信息,请参阅上面的访问说明。
offset可以指定为非负整数偏移量。mmap引用将相对于文件开头的偏移量。偏移 的默认值为0 的偏移必须是多的ALLOCATIONGRANULARITY
,它等于PAGESIZE
在Unix系统。
为了确保创建的内存映射的有效性,描述符fileno指定的文件在内部自动与Mac OS X和OpenVMS上的物理后备存储同步。
此示例显示了一种简单的使用方法mmap
:
import mmap
# write a simple example file
with open("hello.txt", "wb") as f:
f.write(b"Hello Python!\n")
with open("hello.txt", "r+b") as f:
# memory-map the file, size 0 means whole file
mm = mmap.mmap(f.fileno(), 0)
# read content via standard file methods
print(mm.readline()) # prints b"Hello Python!\n"
# read content via slice notation
print(mm[:5]) # prints b"Hello"
# update content using slice notation;
# note that new content must have same size
mm[6:] = b" world!\n"
# ... and read again using standard file methods
mm.seek(0)
print(mm.readline()) # prints b"Hello world!\n"
# close the map
mm.close()
import mmap
with mmap.mmap(-1, 13) as mm:
mm.write(b"Hello world!")
3.2版中的新功能:上下文管理器支持。
下一个示例演示如何创建匿名映射并在父进程和子进程之间交换数据:
import mmap
import os
mm = mmap.mmap(-1, 13)
mm.write(b"Hello world!")
pid = os.fork()
if pid == 0: # In a child process
mm.seek(0)
print(mm.readline())
mm.close()
内存映射文件对象支持以下方法:
close
()
关闭mmap。对该对象的其他方法的后续调用将导致引发ValueError异常。这不会关闭打开的文件。
closed
True
如果文件已关闭。
版本3.2中的新功能。
find
(sub [,start [,end ] ] )
返回找到子序列子对象的最低索引,使得sub包含在[ start,end ] 范围内。可选参数start和end被解释为切片表示法。-1
失败时的回报。
在版本3.5中更改:现在接受可写的字节对象。
flush
([ offset [,size ] ] )
将对文件的内存中副本所做的更改刷新回磁盘。不使用此调用,无法保证在对象被销毁之前写回更改。如果指定了offset和size,则只将对给定字节范围的更改刷新到磁盘; 否则,映射的整个范围都会被刷新。offset必须是PAGESIZE
or 的倍数 ALLOCATIONGRANULARITY
。
(Windows版本)返回的非零值表示成功; 零表示失败。
(Unix版本)返回零值表示成功。呼叫失败时会引发异常。
move
(dest,src,count )
将从offset src开始的计数字节复制到目标索引 dest。如果使用mmap创建,则调用move将引发异常。ACCESS_READ
TypeError
read
([ n ] )
从当前文件位置开始返回bytes
包含最多n个字节的内容。如果省略参数None
或为负,则将所有字节从当前文件位置返回到映射的末尾。文件位置更新为指向返回的字节之后。
在版本3.3中更改:参数可以省略或None
。
read_byte
()
以整数形式返回当前文件位置的字节,并将文件位置前进1。
readline
()
返回单行,从当前文件位置开始直到下一个换行符。
resize
(新闻)
调整地图和基础文件的大小(如果有)。如果使用ACCESS_READ
或创建mmap ACCESS_COPY
,则调整地图大小将引发TypeError
异常。
rfind
(sub [,start [,end ] ] )
返回找到子序列子的对象中的最高索引,使得sub包含在[ start,end ] 范围内。可选参数start和end被解释为切片表示法。-1
失败时的回报。
在版本3.5中更改:现在接受可写的字节对象。
seek
(pos [,whence ] )
设置文件的当前位置。 whence参数是可选的,默认为os.SEEK_SET
或0
(绝对文件定位); 其他值是os.SEEK_CUR
或1
(相对于当前位置寻找)和/ os.SEEK_END
或2
(相对于文件的末尾寻找)。
size
()
返回文件的长度,该长度可能大于内存映射区域的大小。
tell
()
返回文件指针的当前位置。
write
(字节)
将字节以字节为单位写入文件指针当前位置的内存中,并返回写入的字节数(从不小于 len(bytes)
,因为如果写入失败,ValueError
将引发a)。文件位置更新为指向写入的字节之后。如果使用mmap创建ACCESS_READ
,则写入它将引发TypeError
异常。
在版本3.5中更改:现在接受可写的字节对象。
在版本3.6中更改:现在返回写入的字节数。
write_byte
(字节)
将整数字节写入文件指针当前位置的内存中; 文件位置是先进的1
。如果使用mmap创建ACCESS_READ
,则写入它将引发TypeError
异常。