我一直在研究将二进制文件的字节映射到另一组字节的函数。我在同一个文件中读写。我的问题是每次我这样做都会得到额外的字节,除非我在关闭文件之前移到文件的末尾,下面是我的代码:
with open(self._path,'r+b') as source:
for lookAt in range(0,self._size[1]*self._size[2],1):
source.seek(lookAt*self._size[0],0)
readBuffer = array.array('B')
readBuffer.fromfile(source, self._size[0])
newLine = array.array('B',[mappingDict[mat] for mat in readBuffer])
source.seek(lookAt*self._size[0],0)
newLine.tofile(source)
source.seek(0,2) # Magic line that solves stupid bug
source.close()
我使用数组模块读写数据,因为我在使用read()和write()时遇到了相同的问题。我不明白为什么“魔术线”能解决问题,因为它从来没有用过。我会很感激我能在这方面得到的任何见解。在
评论(答案如下):
我看到了和你一样的行为:
输出(在f.write之后使用幻线或缓冲=0或f.flush())
^{pr2}$输出(无魔线)
回答:
如果映射为1->;1,则可以使用
bytes.translate()
:似乎没有
flush()
,io.BufferedRandom就不能做interlaced read/seek/write(Python3中的bug)。在经过一点实验,我猜想这是Python3中的一个bug。在
为了支持我的推测,我提供了以下代码(基于@J.F.Sebastian's):
当使用Python2.7.1运行时,它的工作方式与您预期的一样,并且魔术线没有任何区别。在
当使用python3.1.2运行时,它莫名其妙地需要神奇的no op
seek()
才能使其按预期工作。在在这一点上,我建议向核心python3开发人员演示代码,以获得他们对这是否是一个bug的意见。在
相关问题 更多 >
编程相关推荐