在稀疏文件中间写入二进制数据

5 投票
4 回答
6231 浏览
提问于 2025-04-16 02:19

我需要把一个二进制文件分成几块来编译,而这些块是随机到达的(没错,这是一个点对点的项目)。

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

撰写回答