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.
Bytefolge in Datei finden und verändern
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.
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.
@__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.
Will man die Datei inplace ändern, geht das dann viel kürzer:
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
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()