Entpacken eines Teils einer .gz-Datei mit Python

7

Also hier ist das Problem. Ich habe sample.gz Datei, die etwa 60 KB groß ist. Ich möchte die ersten 2000 Bytes dieser Datei dekomprimieren. Ich fange an CRC-Prüfung fehlgeschlagen Fehler, ich denke, da das Gzip-CRC-Feld am Ende der Datei angezeigt wird, und es erfordert die gesamte Gzip-Datei zu dekomprimieren. Gibt es eine Möglichkeit, dies zu umgehen? Mir ist der CRC-Check egal. Selbst wenn ich wegen schlechter CRC nicht dekomprimiere, ist das in Ordnung. Gibt es eine Möglichkeit, dies zu umgehen und partielle .gz-Dateien zu entpacken?

Der Code, den ich bisher habe, ist

%Vor%

Der Fehler ist

%Vor%

Gibt es auch eine Möglichkeit, das zlib-Modul zu verwenden und die gzip-Header zu ignorieren?

    
user210126 14.11.2009, 00:14
quelle

4 Antworten

11

Ich scheine, dass Sie stattdessen Python zlib Bibliothek suchen

Das GZIP-Format basiert auf zlib, führt aber ein Komprimierungskonzept auf Dateiebene ein, zusammen mit der CRC-Prüfung, und das scheint zu sein, was Sie gerade nicht wollen / brauchen.

Siehe zum Beispiel diese Code-Snippets von Dough Hellman

>

Bearbeiten : Der Code auf Doubh Hellmans Website zeigt nur, wie man mit zlib komprimiert oder dekomprimiert. Wie oben angedeutet, ist GZIP "zlib with a envelope", und Sie müssen das Envellope dekodieren, bevor Sie zu den zlib-komprimierten Daten gelangen per se . Hier sind weitere Informationen dazu, es ist wirklich nicht so kompliziert:

  • siehe RFC 1952 für Details zum GZIP-Format
  • Dieses Format beginnt mit einem 10-Byte-Header, gefolgt von optionalen, nicht komprimierten Elementen wie dem Dateinamen oder einem Kommentar, gefolgt von den zlib-komprimierten Daten, gefolgt von einem CRC-32 (genau einem "Adler32" -CRC) ).
  • Wenn Pythons struct-Modul verwendet wird, sollte die Analyse des Headers relativ einfach sein
  • Die zlib-Sequenz (oder die ersten paar tausend Bytes, da dies das ist, was Sie tun möchten) kann dann mit dem zlib-Modul von python dekomprimiert werden, wie in den obigen Beispielen gezeigt wird.
  • Mögliche Probleme zu behandeln: Wenn es mehr als eine Datei im GZip-Archiv gibt und wenn die zweite Datei innerhalb des Blocks von einigen tausend Bytes beginnt, wollen wir dekomprimieren.

Es tut uns leid, weder ein einfaches Verfahren noch ein bereitstehendes Snippet bereitzustellen, jedoch sollte die Dekodierung der Datei mit der obigen Angabe relativ schnell und einfach sein.

    
mjv 14.11.2009, 00:19
quelle
13

Das Problem mit dem Gzip-Modul ist nicht, dass es die Teildatei nicht dekomprimieren kann, der Fehler tritt nur am Ende auf, wenn es versucht, die Prüfsumme des dekomprimierten Inhalts zu überprüfen. (Die ursprüngliche Prüfsumme wird am Ende der komprimierten Datei gespeichert, sodass die Überprüfung niemals mit einer Teildatei funktioniert.)

Der Schlüssel besteht darin, gzip dazu zu bringen, die Überprüfung zu überspringen. Die Antwort von caesar0301 tut dies, indem sie den Quellcode von gzip ändert, aber es ist nicht notwendig, so weit zu gehen, das einfache Monkey-Patching wird es tun machen. Ich habe diesen Kontextmanager geschrieben, um gzip.GzipFile._read_eof vorübergehend zu ersetzen, während ich die Teildatei dekomprimiere:

%Vor%

Eine Beispielverwendung:

%Vor%     
jiffyclub 03.09.2013 22:08
quelle
9

Ich kann keinen möglichen Grund sehen, warum Sie die ersten 2000 komprimierten Bytes dekomprimieren möchten. Abhängig von den Daten kann dies auf eine beliebige Anzahl von Ausgabebytes dekomprimiert werden.

Sie möchten die Datei sicher dekomprimieren und anhalten, wenn Sie so viele Dateien wie nötig dekomprimiert haben, etwa:

%Vor%

AFAIK, dies wird nicht dazu führen, dass die ganze Datei gelesen wird. Es wird nur so viel gelesen, wie nötig ist, um die ersten 4000 Bytes zu erhalten.

    
rjmunro 14.11.2009 00:22
quelle
2

Ich stoße auch auf dieses Problem, wenn ich mit meinem Python-Skript komprimierte Dateien lese, die vom gzip-Tool unter Linux generiert wurden, und die ursprünglichen Dateien verloren gingen.

Durch das Lesen der Implementierung von gzip.py von Python habe ich dieses gzip gefunden .GzipFile hatte ähnliche Methoden der Dateiklasse und nutzte das Python-Zip-Modul, um Daten zu verarbeiten und zu komprimieren. Gleichzeitig ist die Methode _read_eof () vorhanden, um die CRC jeder Datei zu überprüfen.

Aber in einigen Situationen, wie Stream oder .gz Datei ohne korrekte CRC (mein Problem) verarbeitet, wird ein IOError ("CRC-Prüfung fehlgeschlagen") von _read_eof () ausgelöst. Daher versuche ich das gzip-Modul zu modifizieren, um die CRC-Prüfung zu deaktivieren und schließlich verschwand dieses Problem.

%Vor%

Ссылка

Ich weiß, es ist eine Brute-Force-Lösung, aber es spart viel Zeit, um einige Low-Level-Methoden mit dem Zip-Modul neu zu schreiben, wie beim Lesen von Daten Chuck Chuck von den gezippten Dateien und extrahieren Sie die Daten Zeile für Zeile, die meisten welches im gzip Modul vorhanden war.

Jamin

    
caesar0301 12.05.2013 05:17
quelle

Tags und Links