[Python-de] gzip-lib und "trailing garbage"

Sebastian Wiesner lunaryorn at gmail.com
Sa Jan 26 14:40:36 CET 2013


Am 26. Januar 2013 14:09 schrieb Hartmut Goebel <h.goebel at goebel-consult.de>:
> Hallo,
>
> ich versuche, mit dem Modul gzip eine Datei zu entpacken, die "trailing
> garbage" enthält. (Konkret handelt es sich um einen Binärdatei, bei der die
> gzippten Daten mitten drin liegen, ich kenne also deren Länge nicht.
>
> Das Kommandozeilen gzip liest einfach, was auch immer es kann und ignoriert
> den Rest mit der Warnung "ignoring trailing garbage".

GZIP hat charakteristische Blockgrenzen, anhand derer man derartig
komprimierte Daten erkennen kann.  Du kannst diese Kopfdaten in der
Spezifikation des Formats nachschlagen, und somit das Verhalten von
"gzip" re-implementieren.

Ob das sinnvoll ist, sei dahingestellt.

> Die Python gzip-lib scheint dagegen lustig weiter zu lesen, bzw. versucht,
> einen weiteren Teil zu erkennen. Wenn es den nicht gibt, wird ein IOError
> ausgelöst und die bis habin in dem Block dekomprimierten Daten gelangen
> nicht nach an den Aufrufer :-(
>
> Hier mein gescheiterter Versuch, das in Python zu implementieren.
>
> gz = gzip.GzipFile(fileobj=infh)
> with open(outfilename, 'wb') as outfh:
>     while 1:
>         d = gz.read(BLOCKSIZE)
>         if not d: break
>         outfh.write(d)
>         if gz._new_member:
>             break
> infh.close()

Ohje, wie bist Du denn darauf gekommen?!

> Hat jmd. eine Idee, wie man das lösen könnte?

Ich nehme mal an, dass die Binärdaten, die Du zu lesen versuchst,
irgendeinem mehr oder weniger klar definierten Format unterliegen.
Wieso parst Du nicht einfach dieses Format insoweit, als dass Du die
GZIP-Daten, an denen Du interessiert bist, aus den Daten extrahieren
und dann die GZIP-Daten – und **nur** die GZIP-Daten – an "gzip"
übergeben kannst?


Mehr Informationen über die Mailingliste python-de