Ich habe zlib-komprimierte Daten in Python erstellt, etwa so:
import zlib
s = '...'
z = zlib.compress(s)
with open('/tmp/data', 'w') as f:
f.write(z)
(oder Einzeiler in Shell: echo -n '...' | python2 -c 'import sys,zlib; sys.stdout.write(zlib.compress(sys.stdin.read()))' > /tmp/data
)
Nun möchte ich die Daten in der Shell dekomprimieren. Weder zcat
noch uncompress
funktionieren:
$ cat /tmp/data | gzip -d -
gzip: stdin: not in gzip format
$ zcat /tmp/data
gzip: /tmp/data.gz: not in gzip format
$ cat /tmp/data | uncompress -
gzip: stdin: not in gzip format
Es scheint, dass ich eine gzip-ähnliche Datei erstellt habe, aber ohne Header. Leider finde ich in der gzip-Manualseite keine Option zum Dekomprimieren solcher Rohdaten, und das zlib-Paket enthält kein ausführbares Dienstprogramm.
Gibt es ein Dienstprogramm zum Dekomprimieren von zlib-Rohdaten?
Ich habe eine Lösung gefunden (eine der möglichen), es ist mit openssl:
$ openssl zlib -d < /tmp/data
oder
$ openssl zlib -d -in /tmp/data
*HINWEIS: zlib-Funktionalität ist offenbar in neueren openssl-Versionen >=1.0.0 verfügbar (OpenSSL muss mit der Option zlib oder zlib-dynamic konfiguriert/gebaut werden, letztere ist Standard)
zlib
implementiert die von gzip verwendete Kompression, aber nicht das Dateiformat. Stattdessen sollten Sie das gzip
-Modul verwenden, das selbst zlib
benutzt.
import gzip
s = '...'
with gzip.open('/tmp/data', 'w') as f:
f.write(s)
Das könnte genügen:
import glob
import zlib
import sys
for filename in sys.argv:
with open(filename, 'rb') as compressed:
with open(filename + '-decompressed', 'wb') as expanded:
data = zlib.decompress(compressed.read())
expanded.write(data)
Dann führen Sie es so aus:
$ python expander.py data/*