Python 尝试在windows下写入mmap时出现奇怪的错误
下面是简单的python代码:Python 尝试在windows下写入mmap时出现奇怪的错误,python,windows,mmap,Python,Windows,Mmap,下面是简单的python代码: import mmap with file("o:/temp/mmap.test", "w+b") as fp: m = mmap.mmap(fp.fileno(), 0, access=mmap.ACCESS_READ|mmap.ACCESS_WRITE) m.write("Hello world!") 产生以下错误(在mmap.mmap(…)行): WindowsError:[错误1006]文件的卷已被外部更改,因此打开的文
import mmap
with file("o:/temp/mmap.test", "w+b") as fp:
m = mmap.mmap(fp.fileno(), 0, access=mmap.ACCESS_READ|mmap.ACCESS_WRITE)
m.write("Hello world!")
产生以下错误(在mmap.mmap(…)行):WindowsError:[错误1006]文件的卷已被外部更改,因此打开的文件不再有效
知道为什么吗 很可能是因为
w+
截断了文件,而Windows在尝试从长度为0的文件创建空映射时出错。改用r+
同样,您不应该使用access=mmap.access\u READ | mmap.access\u WRITE
:
>>> mmap.ACCESS_READ
1
>>> mmap.ACCESS_WRITE
2
>>> mmap.ACCESS_COPY
3
>>> mmap.ACCESS_READ | mmap.ACCESS_WRITE
3
换句话说,access=mmap.access\u READ | mmap.access\u WRITE
与access=mmap.access\u COPY
相同。您想要的很可能是access=mmap.access\u WRITE
,而在Windows上,如果不显式使用该参数,您将得到该参数
试试这个:
import mmap
with file("o:/temp/mmap.test", "r+b") as fp:
m = mmap.mmap(fp.fileno(), 0)
m.write("Hello world!")
(mmap docs:)很可能是因为
w+
截断了文件,Windows在尝试从长度为0的文件创建空映射时出错。改用r+
同样,您不应该使用access=mmap.access\u READ | mmap.access\u WRITE
:
>>> mmap.ACCESS_READ
1
>>> mmap.ACCESS_WRITE
2
>>> mmap.ACCESS_COPY
3
>>> mmap.ACCESS_READ | mmap.ACCESS_WRITE
3
换句话说,access=mmap.access\u READ | mmap.access\u WRITE
与access=mmap.access\u COPY
相同。您想要的很可能是access=mmap.access\u WRITE
,而在Windows上,如果不显式使用该参数,您将得到该参数
试试这个:
import mmap
with file("o:/temp/mmap.test", "r+b") as fp:
m = mmap.mmap(fp.fileno(), 0)
m.write("Hello world!")
(mmap文档:)来自:
如果长度为0,则最大长度为
地图是地图的当前大小
文件,除非该文件为空
Windows引发了一个异常(您需要)
无法在上创建空映射
窗户)
您正在用“w+”打开文件-文件被截断。。。(大小=0)来自:
如果长度为0,则最大长度为
地图是地图的当前大小
文件,除非该文件为空
Windows引发了一个异常(您需要)
无法在上创建空映射
窗户)
您正在用“w+”打开文件-文件被截断。。。(大小=0)供参考-使用python 2.7.6
dataFile = open(dFile, mode='r+b') # failed with windows access error
dataFile = open(dFile, 'r+b') # works
读取r+b,以绕过数据中的\x1a子字符,将其视为文件结尾FYI-使用python 2.7.6
dataFile = open(dFile, mode='r+b') # failed with windows access error
dataFile = open(dFile, 'r+b') # works
读取r+b,以绕过数据中的\x1a子字符(视为文件结尾)尝试了r+,但它给出了相同的错误。access=确实是多余的,但添加它只是为了确保windows不会以奇怪的方式说“权限被拒绝”@Paul-文件中是否填充了数据?长度=0将仅适用于非空文件。如果指定一个长度,那么文件将被扩展。一切正常:令人困惑的部分是错误消息的文本(请参阅我对Jeremy的评论)。我想即使是一个“总是看到生活光明的一面”也会是一个更好的文本来解释这个错误。@Paul:特别是当它使计算机在抛出时发出哨声时。尝试了r+,但它给出了相同的错误。access=确实是多余的,但添加它只是为了确保windows不会以奇怪的方式说“权限被拒绝”@Paul-文件中是否填充了数据?长度=0将仅适用于非空文件。如果指定一个长度,那么文件将被扩展。一切正常:令人困惑的部分是错误消息的文本(请参阅我对Jeremy的评论)。我想,即使是“永远看生活光明的一面”也能更好地解释这个错误。@Paul:尤其是当电脑被抛出时,它会发出汽笛声。是的,你是对的。我在错误消息的奇怪文本中徘徊,但刚刚发现1006只是CreateFileMapping()产生的Win32错误文件无效…是的,你是对的。我在错误消息的奇怪文本中徘徊,但刚刚发现1006只是CreateFileMapping()产生的Win32错误文件无效。。。