2015-07-31 22 views
7

Vorrei decomprimere un file .7z. Secondo questo question posso usare il pacchetto lzma per fare questo.Python3: lzma unpack .7z file

mi aspettavo qualcosa di simile

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

Per estrarre il file nella directory corrente, ma sembra qualcosa di simile non esiste. Inoltre, provare qualcosa come

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

ha prodotto _lzma.LZMAError: Input format not supported by decoder. Come posso controllare il formato? E sono abbastanza sorpreso perché ho pensato che sia 7zip che il formato .7z siano open source e Python dovrebbe supportare tutto.

Ho visto molte risposte in cui le persone stavano solo chiamando l'eseguibile 7zip con un sottoprocesso ma questo non è ciò che voglio fare. Sto cercando una semplice soluzione python3.

risposta

10

LZMA e 7z sono due molto diverse bestie.

In termini più semplici, LZMA è un algoritmo lossless compression. Ciò vuol dire che, date da mangiare a LZMA alcuni dati, questo si comprimerà e vi darà l'output. Non ha senso di file, cartelle o come memorizzarli.

7z d'altra parte è un archive file format, e questo significa che 7z è un pacchetto completo. Hai pochi file e cartelle, alimentali a 7z, li comprimerà in modo ordinato e li memorizzerà in un unico file (archivio). Nota che 7z usa LZMA e un cocktail di altri algoritmi per comprimere e archiviare i file nel suo file di archivio 7z.

Ecco cosa Wikipedia ha avuto modo di dire sul due:

7z è un formato di file di archivio compresso che supporta diversi diversa compressione dei dati, la crittografia e la pre-elaborazione di algoritmi.

L'algoritmo della catena Lempel-Ziv-Markov (LZMA) è un algoritmo utilizzato per eseguire la compressione dei dati senza perdita di dati. È stato in fase di sviluppo dal 1996 al 1998 3 ed è stato utilizzato per la prima volta nel formato 7z dell'archiviatore 7-Zip.

Quindi, in breve, non è possibile utilizzare lzma per creare o estrarre file 7z. Per quanto ne so, non c'è modo di estrarre un file 7z usando python diverso da:

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

FYI: libarchive ha associazioni per python. Sono stato in grado di estrarre i file 7z usando libarchive. Se questa funzione è disponibile nei collegamenti Python non ho testato. Ma vale la pena provare. – Marcus