在稀疏文件中间写入二进制数据
我需要把一个二进制文件分成几块来编译,而这些块是随机到达的(没错,这是一个点对点的项目)。
def write(filename, offset, data)
file.open(filename, "ab")
file.seek(offset)
file.write(data)
file.close()
比如说,我有一个32KB的数据写入操作,位置是在文件的1MB偏移处,然后又有一个32KB的数据写入操作,位置是在0偏移处。
最终我得到的文件长度是65KB(也就是说,32KB到1MB之间的那段空白部分被截断了,变成了0s,消失了)。
我知道这个问题可能听起来很傻,但我就是搞不清楚文件打开的模式(file.open(..))该怎么用。
非常感谢任何建议。
*** 更新
我写P2P数据块的方法如下(希望对有需要的人有帮助)。
def writePiece(self, filename, pieceindex, bytes, ipsrc, ipdst, ts):
file = open(filename,"r+b")
if not self.piecemap[ipdst].has_key(pieceindex):
little = struct.pack('<'+'B'*len(bytes), *bytes)
# Seek to offset based on piece index
file.seek(pieceindex * self.piecesize)
file.write(little)
file.flush()
self.procLog.info("Wrote (%d) bytes of piece (%d) to %s" % (len(bytes), pieceindex, filename))
# Remember we have this piece now in case duplicates arrive
self.piecemap[ipdst][pieceindex] = True
file.close()
注意:我还解决了一些字节序的问题,使用了struct.pack,这让我困扰了一段时间。
顺便说一下,我正在做的项目是分析直接从网络抓取的BT消息。
4 个回答
0
试试用'r+b',而不是'ab'。
4
你是以追加模式("a"
)打开这个文件的。无论你怎么使用seek()
去移动文件指针,所有写入的内容都会被加到文件的最后面。
7
在编程中,有时候我们会遇到一些问题,特别是在使用某些工具或者库的时候。比如,有人可能在使用一个叫做“库”的东西时,发现它的某些功能没有按照预期工作。这种情况可能会让人感到困惑,因为我们可能不知道问题出在哪里。
通常,解决这类问题的方法是仔细检查代码,看看有没有拼写错误,或者使用的功能是否正确。有时候,查看相关的文档或者社区的讨论也能帮助我们找到答案。
另外,分享你的问题和代码片段到一些技术论坛,比如StackOverflow,可以得到其他人的帮助。记得在提问时,尽量描述清楚你遇到的问题和你已经尝试过的解决方法,这样别人才能更好地理解你的情况。
>>> import os
>>> filename = 'tempfile'
>>> def write(filename,data,offset):
... try:
... f = open(filename,'r+b')
... except IOError:
... f = open(filename,'wb')
... f.seek(offset)
... f.write(data)
... f.close()
...
>>> write(filename,'1' * (1024*32),1024*1024)
>>> write(filename,'1' * (1024*32),0)
>>> os.path.getsize(filename)
1081344