Файл Python3: lzma unpack.7z

Я хотел бы распаковать файл .7z. В соответствии с этим question я могу использовать lzma, чтобы сделать это.

Я ожидал чего-то вроде

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.

Ответ 1

LZMA и 7z - два совершенно разных зверя.

Проще говоря, LZMA - это алгоритм сжатия без потерь. Это означает, что если вы передадите LZMA некоторые данные, они будут сжаты и предоставят вам вывод. У него нет смысла в файлах, папках или как их хранить.

7z - это формат файла архива, а это значит, что 7z - это полный пакет. У вас есть несколько файлов и папок, подайте его в 7z, он аккуратно сожмет их и сохранит в одном файле (архиве). Обратите внимание, что 7z использует LZMA и набор других алгоритмов для сжатия и хранения файлов в своем архивном файле 7z.

Вот что Википедия может сказать о двух:

7z - это сжатый формат файла архива, который поддерживает несколько различных алгоритмов сжатия, шифрования и предварительной обработки данных.

Цепной алгоритм Лемпеля – Зива – Маркова (LZMA) - это алгоритм, используемый для сжатия данных без потерь. Он разрабатывался с 1996 или 1998 года 3 и впервые использовался в формате 7z 7-Zip-архиватора.

Короче говоря, вы не можете использовать lzma для создания или извлечения файлов 7z. Насколько я знаю, нет никакого способа извлечь файл 7z, используя python, кроме: Смотрите обновление ниже.

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

Обновление: май 2019

Поскольку есть некоторый интерес к извлечению файлов 7z в python, я подумал, что обновление в порядке. Начиная с 2019 года (возможно, даже раньше), привязки libarchive для python поддерживают формат 7z. Пример извлечения файлов из архива 7z приведен в ссылке выше.