Seite 1 von 1
Bytefolge in Datei finden und verändern
Verfasst: Montag 11. Dezember 2017, 15:51
von Anbeku
Hallo zusammen,
ich habe schon recht lange Erfahrung im Programmieren, allerdings nicht in Python. Für mein aktuelles Problem brauche ich allerdings eine "Skriptsprache" und da ist mir Python am liebsten. Hab damit schon einfache Sachen gemacht, aber bei meinem aktuellen Problem komme ich nicht vorwärts:
Ich möchte eine bestimmte Stelle in einer großen Binärdatei manipulieren. Dazu müsste ich erst mal die Stelle finden, die durch einen speziellen String gekennzeichnet ist und den "Dateicurser" dahinter bewegen. Daran scheitere ich. Gibt es eine fertige Lösung um eine Binärdatei zu durchsuchen oder muss ich das irgendwie "zu Fuss" programmieren? Hab da leider nichts gefunden.
Re: Bytefolge in Datei finden und verändern
Verfasst: Montag 11. Dezember 2017, 16:45
von __deets__
Das kommt drauf an. Wie gross ist denn deine Datei, und wie gross ist dein Hauptspeicher, wie gross die Needle, und wie gross das Stueck das ersetzt/eingefuegt wird?
Wenn die Datei zweimal in den Memory rein passt, dann ist es ein simples string-replace. Wenn nicht, dann werden es vielleicht 20 Zeilen mit blockweisem lesen, und sicherstellen, das man auch an Blockgrenzen die Suchstelle nicht verliert.
Re: Bytefolge in Datei finden und verändern
Verfasst: Montag 11. Dezember 2017, 23:05
von Sirius3
Solange die Datei in den virtuellen Adressraum passt, macht man so etwas mit MemoryMappedFiles, das sind dann drei Zeilen Code.
Re: Bytefolge in Datei finden und verändern
Verfasst: Montag 11. Dezember 2017, 23:47
von __deets__
@Sirius3 ich bin da nicht besonders bewandert, aber können mapped Dateien mit Verschiebungen gut um?
Re: Bytefolge in Datei finden und verändern
Verfasst: Dienstag 12. Dezember 2017, 08:16
von Sirius3
@__deets__: die meisten Binärdateien können nicht mit Verschiebungen umgehen. Daher gehe ich davon aus, dass Anbeku die Länge nicht ändern will. Ansonsten muß man halt erst alles bis zur Fundstelle in eine neue Datei schreiben, dann den Ersetzungstext, und dann alles danach.
Code: Alles auswählen
import mmap
with open(FILENAME, 'rb') as data:
data = mmap.mmap(data.fileno(),0, access=mmap.ACCESS_READ)
index = data.find(SUCHTEXT)
with open(OUTPUTNAME, 'wb') as output:
offset = 0
while offset < index:
blocksize = min(4096, index-offset)
output.write(data[offset: blocksize])
offset += blocksize
output.write(ERSETZUNGSTEXT)
offset += len(SUCHTEXT)
index = len(data)
while offset < index:
blocksize = min(4096, index-offset)
output.write(data[offset: blocksize])
offset += blocksize
Will man die Datei inplace ändern, geht das dann viel kürzer:
Code: Alles auswählen
import mmap
with open(FILENAME, 'rwb') as data:
data = mmap.mmap(data.fileno(), 0, access=mmap.ACCESS_READ)
index = data.find(SUCHTEXT)
data[index:index+len(ERSETZUNGSTEXT)] = ERSETZUNGSTEXT
data.close()
Re: Bytefolge in Datei finden und verändern
Verfasst: Dienstag 12. Dezember 2017, 11:42
von Anbeku
Die Datei passt problemlos in den Speicher. Damit ist die Lösung eigentlich recht einfach. Hab mir da wohl zu viele Gedanken gemacht. danke euch allen.