Domanda

Ho bisogno di compilare un file binario in pezzi con pezzi che arrivano in ordine casuale (sì, proprio un progetto P2P)

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

Di 'Ho un 32KB scrittura (f, o, d) all'offset 1 MB in file di 32 KB e poi un altro di scrittura (f, o, d) all'offset 0

I finire con un 65KB file in lunghezza (cioè il divario consistente di 0s tra 32 KB - 1MB viene troncato / scompare)

Sono consapevole questo può apparire una questione incredibilmente stupido, ma io non riesco a capirlo dal file.open (..) le modalità

Consigli con gratitudine.

*** AGGIORNAMENTO

Il mio metodo a pezzi P2P scrittura finì come segue (per coloro che possono ricavare qualche valore da esso)

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

Nota: ho anche affrontato alcuni problemi endian utilizzando struct.pack che mi ha tormentato per un po '.

Per chiunque chiedendo, il progetto cui sto lavorando è quello di analizzare i messaggi BT catturate direttamente dalla rete.

È stato utile?

Soluzione

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

Altri suggerimenti

Si apre il file in modalità append ("a"). Tutte le operazioni di scrittura sono in corso alla fine del file, indipendentemente dalle chiamate a seek().

Provare a utilizzare 'r + b', piuttosto che 'ab'.

Mi sembra come se non ci sia un sacco di punto nel tentativo di assemblare il file fino a quando tutti i pezzi di esso ci sono. Perché non tenere i pezzi separati fino a quando tutti sono presenti, per poi scrivere sul file finale in ordine? Questo è ciò che la maggior parte delle applicazioni P2P fanno, per quanto ne so.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top