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

时间:2010-08-04 16:12:09

标签: python file-io binary p2p sparse-matrix

我需要编译一个二进制文件,其中各个部分以随机顺序到达(是的,它是一个P2P项目)

def write(filename, offset, data) 
    file.open(filename, "ab")
    file.seek(offset) 
    file.write(data) 
    file.close()

假设我在偏移量为1MB的文件中写入了32KB写入(f,o,d),然后在偏移量0处写入另一个32KB写入(f,o,d)

我最终得到一个长度为65KB的文件(即在32KB到1MB之间由0组成的间隙被截断/消失)

我知道这可能看起来是一个令人难以置信的愚蠢问题,但我似乎无法从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解决了一些困扰我一段时间的endian问题。

对于任何想知道的人,我正在研究的项目是分析直接从线路上捕获的BT消息。

4 个答案:

答案 0 :(得分:6)

>>> 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

答案 1 :(得分:4)

您以追加("a")模式打开文件。无论对seek()的调用如何,所有写操作都将转到文件的末尾。

答案 2 :(得分:0)

尝试使用'r + b'而不是'ab'。

答案 3 :(得分:0)

在我看来,在尝试组装文件之前没有太多意义,直到它的所有部分都存在。为什么不将各个部分分开直到所有部分都存在,然后按顺序将它们写入最终文件?这就是大多数P2P应用程序所做的,AFAIK。