2012-03-16 15 views
5

Si tratta di una questione teorica, come non ho un problema reale, ma ho avuto modo di chiedersi ...Python - piccola modifica a un file enorme

Se ho avuto un enorme file di , dire molti concerti a lungo e volevo cambiare un singolo byte e conoscevo l'offset di quel byte, come potevo farlo in modo efficiente? C'è un modo per farlo senza riscrivere l'intero file e solo scrivendo il singolo byte?

Non vedo nulla nel file Python che mi consente di scrivere su un offset specifico in un file.

+2

http://docs.python.org/library/stdtypes.html#file.seek Si imposta la posizione del cursore usando seek(), quindi write(), quindi flush() per salvare le modifiche. – shimofuri

risposta

8

Finché non c'è bisogno di inserto o eliminare byte, è possibile aprire il file in modalità "r+", usa il metodo di seek per posizionare l'oggetto file al byte da modificare e scrivere un byte.

Potrebbe essere più efficiente utilizzare le operazioni di livello inferiore os.open, os.lseek, os.read, and os.write, che non eseguono alcun buffering a livello di applicazione.

Se fai necessità di inserire o cancellare byte, mi dispiace, sei fuori di fortuna: non c'è modo di farlo senza dover riscrivere l'intero file (dal punto di primo inserimento o la cancellazione). Questa è una limitazione delle API di file di basso livello POSIX (e AFAIK anche Windows), non di Python in particolare.

+0

Sicuramente hai solo bisogno di scrivere il file dal punto di montaggio, non l'intero file? – Marcin

+0

Bella risposta. Grazie mille! Ma intendevi riscrivere "dal punto del primo cambiamento" piuttosto che l'intero file? Sto solo facendo riferimento al tuo commento da sotto. – fthinker

+0

Sì, entrambi avete ragione, stavo semplificando un po '. (La tecnica standard per la sostituzione di un file * atomicamente * implica la realizzazione di una copia completa, così spesso la gente lo fa comunque.) – zwol

2

È possibile cercare() in una posizione e scrivere un singolo byte. Sovrascriverà quello che c'è, invece di inserirlo.

+0

Ah, ok, in relazione a questo, cosa succede se volevo inserire? In ogni caso (inserimento/modifica) l'intero file viene riscritto o è scritto solo un singolo byte? O questo dipende solo dalla fs? – fthinker

+4

Né Unix (incluso OSX) né Windows (AFAIK) forniscono chiamate di sistema per inserire o eliminare byte da un file di grandi dimensioni senza dover riscrivere l'intero file dal punto della prima modifica. – zwol

2

Cercare in quella posizione nel file e scrivere un singolo byte. oggetti file in Python hanno un metodo che accetta un numero intero offset da qualche costante cercano:

seek(offset[, whence]) 

L'argomento donde è facoltativo e il valore predefinito è 0 (posizione assoluta nel file); altri valori sono 1 (ricerca relativa alla posizione corrente) e 2 (ricerca relativa all'estremità del file).

Problemi correlati