web-dev-qa-db-ja.com

Python3:lzmaアンパック.7zファイル

.7zファイルを解凍します。これによると questionlzma パッケージを使用してこれを行うことができます。

のようなものを期待していた

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

現在のディレクトリにファイルを抽出しますが、このようなものは存在しないようです。さらに次のようなものを試します

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

収量_lzma.LZMAError: Input format not supported by decoder。形式を確認するにはどうすればよいですか?そして、7Zipと.7z形式の両方がオープンソースであり、pythonがすべてをサポートする必要があると考えました。

私は人々がサブプロセスで7Zip実行可能ファイルを呼び出しているだけの多くの答えを見ましたが、これは私がやりたいことではありません。私は単純なpython3ソリューションを探しています。

17
Sjoerd222888

LZMAと7zは2つの非常に異なる野獣です。

最も簡単な用語では、LZMAは 可逆圧縮 アルゴリズムです。つまり、LZMAにデータをフィードすると、圧縮されて出力が得られます。ファイル、フォルダ、またはそれらを保存する方法については意味がありません。

一方、7zは アーカイブファイル形式 であり、これは7zが完全なパッケージであることを意味します。いくつかのファイルとフォルダーがあり、それを7zにフィードすると、きれいに圧縮され、1つのファイル(アーカイブ)に保存されます。 7zは、LZMAおよび他のアルゴリズムの組み合わせを使用して、ファイルを7zアーカイブファイルに圧縮および保存することに注意してください。

ここにウィキペディアが2つについて言わなければならないものがあります:

7z は、いくつかの異なるデータ圧縮、暗号化、および前処理アルゴリズムをサポートする圧縮アーカイブファイル形式です。

Lempel–Ziv–Markovチェーンアルゴリズム( [〜#〜] lzma [〜#〜] )は、ロスレスデータ圧縮を実行するために使用されるアルゴリズムです。 1996年または1998年以来開発中であり、は7-Zipアーカイバの7z形式で最初に使用されました。

つまり、lzmaを使用して7zファイルを作成または抽出することはできません。私の知る限り、pythonを使用して7zファイルを抽出する方法はありません。 以下の更新を参照してください。

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

更新:2019年5月

Pythonで7zファイルを抽出することに関心があるため、更新が必要だと思いました。 2019年(おそらくそれ以前にも)、現在の libarchive bindings for python do support 7z format。7zアーカイブからファイルを抽出する例は上記に示されています)リンク。

24
Marcus