2016-07-25 10 views
-1

Wie kann ich Daten aus einer Datei lesen, die Daten bearbeiten und wieder in die Datei schreiben, ohne Speicher auf eine temporäre Datei zu verschwenden, wenn die Datei zu groß für die Verarbeitung ist in einem Stück?Lesen, Bearbeiten und Neuschreiben von Text in Datei mit Python

+0

Durch die Manipulation bedeuten Sie, Zeichen darin zu ändern oder mehrere Zeichen hinzuzufügen/zu entfernen, wodurch sich die Größe der Ausgabedatei ändert. Im ersten Fall lesen Sie nur Chunks ein und überschreiben dann die Chunks in der Datei. Im zweiten Fall (Änderung der Länge der Datei) wird es nicht funktionieren, Sie müssen eine separate Ausgabedatei erstellen. –

Antwort

0

sollte der folgende Code arbeiten:

chunksize = 64*1024 #arbitrary number 
offset = 0 
with open(path, 'r+b') as file: 
    while True: 
     file.seek(chunksize*offset) # sets pointer to reading spot 
     chunk = file.read(chunksize) 
     if len(chunk) == 0: # checks if EoF 
      break 
     elif len(chunk) % 16 != 0: # adds bytes to the chunk if it is the last chunk and size doesnt divide by 16 (if processing text of specific size, my case 16 bytes) 
      chunk += ' ' * (16 - len(chunk) % 16) 
     file.seek(chunksize*offset) # returns pointer to beginning of the chunk in order to rewrite the data that was encrypted 
     file.write(do_something(chunk)) # edits and writes data to file 
     offset += 1 

Der Code liest die Daten, kehrt an den Anfang des Blockes und überschreibt sie. Es wird nicht funktionieren, wenn die manipulierten Daten größer als die gelesenen Daten sind.

+0

Dadurch bleiben Teile der Datei unverändert, wenn die manipulierten Daten kleiner als "chunksize" sind. Anstatt nach 'chunksize * offset' zu suchen, sollten Sie verfolgen, wo die modifizierten Daten tatsächlich enden. –

+0

Damit es funktioniert, müssen Sie Daten genau der Größe der gelesenen Daten manipuliert haben. Wenn Sie 'chunksize * offset' nicht verwenden, liegen zwischen dem Ende der geschriebenen Daten und dem Anfang der gelesenen Daten beschädigte Daten vor – IsaacDj