2015-07-31 14 views
7

Ich möchte eine .7z-Datei entpacken. Entsprechend diesem question kann ich das lzma Paket verwenden, um dies zu tun.Python3: lzma entpacken .7z Datei

Ich erwartete etwas wie

import lzma 
#... 
with lzma.open('myFile.7z') as f: 
    f.extractall('.') 

Um die Datei in das aktuelle Verzeichnis zu extrahieren, aber es scheint so etwas wie dieses gibt es nicht. Des Weiteren versucht hat _lzma.LZMAError: Input format not supported by decoder so etwas wie

import lzma 
#... 
with lzma.open('myFile.7z') as f: 
    file_content = f.read() 
    print(file_content) 

zu ergeben. Wie kann ich das Format prüfen? Und ich bin ziemlich überrascht, weil ich dachte, 7zip und das .7z-Format sind Open Source und Python sollte alles unterstützen.

Ich sah eine Menge Antworten, wo Leute nur die 7zip ausführbare Datei mit einem Subprozess aufrufen, aber das ist nicht wollen ich tun möchte. Ich suche eine einfache python3-Lösung.

Antwort

10

LZMA und 7z sind zwei sehr unterschiedliche Tiere.

In den einfachsten Begriffen LZMA ist ein lossless compression Algorithmus. Das bedeutet, dass Sie LZMA einige Daten zuführen, diese komprimieren und Ihnen die Ausgabe geben. Es hat keinen Sinn für Dateien, Ordner oder wie man sie speichert.

7z auf der anderen Seite ist ein archive file format, und das bedeutet, dass 7z ist ein komplettes Paket. Sie haben ein paar Dateien und Ordner, füttern Sie es zu 7z, es wird sie sauber komprimieren und in einer einzigen Datei (Archiv) speichern. Bitte beachten Sie, dass 7z LZMA und einen Cocktail anderer Algorithmen verwendet, um Dateien in der 7z-Archivdatei zu komprimieren und zu speichern. Hier

ist, was wikipedia bekommen hat über die beide zu sagen:

7z ist ein komprimiertes Archiv-Datei-Format, die mehrere unterschiedliche Datenkompression, Verschlüsselung und Pre-Processing-Algorithmen unterstützt.

Der Lempel-Ziv-Markov-Kettenalgorithmus (LZMA) ist ein Algorithmus zur verlustfreien Datenkomprimierung. Es wurde entweder seit 1996 oder 1998 entwickelt 3 und wurde erstmals im 7z-Format des 7-Zip Archiver verwendet.

Kurz gesagt, Sie können nicht mit lzma 7z-Dateien erstellen oder extrahieren. So weit ich weiß, gibt es keine Möglichkeit, eine 7z-Datei mit Python zu extrahieren, außer:

import os 
os.system('7z x archive.7z -oPath/to/Name') 
+0

FYI: libarchive hat Bindungen für Python. Ich konnte mit libarchive 7z-Dateien extrahieren. Wenn diese Funktion in den Python-Bindungen verfügbar ist, die ich nicht getestet habe. Aber es ist einen Versuch wert. – Marcus