[Python-de] Binärdaten patchen

Gerald Klix Gerald.Klix at klix.ch
Don Jul 7 14:40:28 CEST 2005


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Hi Henning,
das geht relativ einfach ohne das man zeilenweise einliest :=)

Das mmap Modul ist dein Freund.
Ich hatte mal das gleiche Probelm mit riesen Printjobs bei der Paynet.

In etwa geht das so:

- --- snip --
import mmap

self.file = open( filename, "rb" )
# This is neccessary for unix systems
size = os.fstat( self.file.fileno() )[ stat.ST_SIZE ]
self.mapping = mmap.mmap( self.file.fileno(), size, access =
mmap.ACCESS_READ )

substitutionStart = self.mapping.find( self.oldHeaderStart  )
outfile.write( buffer( self.mapping, 0, substitutionStart ) )
outfile.write( self.substitutionText() )
outfile.write(
~ buffer(
~  self.mapping,
~   substitutionStart + substitutionConstantLength ) )
- --- snip ---

Obiger Kode ist aus alten Teilen zusammmengestöpselt
und nicht getestet.

Der Vorteil der ganzen Lösung ist, daß du dir das zeitintensive
zeilenweise Lesen sparst. Lesen wird sozusagen vom virtual memory
management des OS erledigt.

BTW: Ich hab damals unter Linux entwickelt und interessehalber unter
Windows getestet. Am Ende liefs dann auf Tru64.

HTH,
Gerald


Henning.Ramm at mediapro-gmbh.de schrieb:
| Hallo zusammen!
|
| Ich muss ziemlich große Dateien (bis ca. 300 MB) ver- und bearbeiten.
| Einerseits muss ich zeilenweise lesen/schreiben, andererseits darf ich
große binäre Blöcke auf keinen Fall verändern.
|
| Genauer:
| Ich muss den PostScript-Dateien unserer Zeitungsseiten einen Header
hinzufügen, aber den ursprünglichen Header entfernen (oder zumindest
auskommentieren).
| Dafür muss ich also den ersten Teil der Datei zeilenweise einlesen
(wobei gemischte Zeilenenden vorkommen können) und den Rest dann
blockweise kopieren, ohne dass auch nur ein Byte verloren gehen darf und
ohne dass Python versucht, irgendetwas zu decodieren.
| Noch praktischer wäre es, wenn ich auch in diesem Teil noch nach
"einfachen Zeilen" (DSC-Kommentaren) suchen könnte.
| Das Ganze sollte auch noch möglichst effektiv sein...
|
| Wie mache ich sowas mit Python?
| Ich habe etwas Ähnliches mit Perl gefunden (O'Reilly Perl Kochbuch, S.
332), weiß aber nicht, ob ich Perls syswrite durch Pythons write
ersetzen kann.
| (Fertige Lösung willkommen, Hinweis auf passende Doku ebenso.)
|
| Noch besser wäre es, wenn ich auch noch codiertes PostScript (z.B.
ASCII85) entschlüsseln könnte...
|
| Grüße vom Südsee!
| Henning Hraban Ramm
| Südkurier Medienhaus / MediaPro
| Systembetreuung / Systementwicklung
|
| _______________________________________________
| python-de maillist  -  python-de at python.net
| http://python.net/mailman/listinfo/python-de

- --
GPG-Key: http://keyserver.veridis.com:11371/search?q=0xA140D634
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.4 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iD8DBQFCzSK8EDg9cqFA1jQRAocfAJ9BfB4uK5+OuyZuKWi+IYfQf2T66QCfTisJ
r+PoxxidgWYsKnKGqVQ56ns=
=+VX0
-----END PGP SIGNATURE-----