cod*_*one 4 python binary file-io p2p sparse-matrix
我需要编译一个二进制文件,其中各个部分以随机顺序到达(是的,它是一个P2P项目)
def write(filename, offset, data)
file.open(filename, "ab")
file.seek(offset)
file.write(data)
file.close()
Run Code Online (Sandbox Code Playgroud)
假设我在偏移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()
Run Code Online (Sandbox Code Playgroud)
注意:我还使用struct.pack解决了一些困扰我一段时间的endian问题.
对于任何想知道的人来说,我正在研究的项目是分析直接从线路上捕获的BT消息.
>>> 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
Run Code Online (Sandbox Code Playgroud)