Scrittura dei dati binari per mezzo di un file sparse
-
25-09-2019 - |
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.
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.