Как прочитать содержимое файла 7z с помощью python

Как я могу прочитать и сохранить содержимое 7z. Я использую Python 2.7.9, я могу извлекать или архивировать вот так, но я не могу читать содержимое в python, я только перечисляю содержимое файла в CMD

import subprocess
import os

source = 'filename.7z'
directory = 'C:\Directory'
pw = '123456'
subprocess.call(r'"C:\Program Files (x86)\7-Zip\7z.exe" x '+source +' -o'+directory+' -p'+pw)

person Ken Kem    schedule 26.09.2015    source источник
comment
возможный дубликат Python - как сжать с помощью 7zip вместо zip, изменение кода   -  person John Zwinck    schedule 26.09.2015


Ответы (5)


Если вы можете использовать Python 3, есть полезная библиотека py7zr, которая поддерживает сжатие архива 7zip, распаковку, шифрование и дешифрование.

import py7zr
with py7zr.SevenZipFile('sample.7z', mode='r') as z:
    z.extractall()
person Zhou Hongbo    schedule 21.07.2020

Вы можете использовать либо libarchive, либо pylzma. Если вы можете перейти на python3.3+, вы можете использовать lzma, который находится в стандартная библиотека.

person mr nick    schedule 26.09.2015
comment
Я всегда использую Python 2.7.9, я не знаю, что 3.3+ имеет стандартную библиотеку для 7z, так что большое спасибо - person Ken Kem; 26.09.2015
comment
Обратите внимание, что lzma не работает с архивами 7z, а только с отдельными файлами. - person bfontaine; 22.04.2016
comment
Так что lzma — не та библиотека, и я просто потратил время, чтобы заставить ее работать. Понизить. - person shinzou; 23.12.2017
comment
libarchive по умолчанию не работает в Windows. Установка не будет выполнена с этой ошибкой: Library can not be loaded: Could not find module 'libarchive.so'.... Вы должны скомпилировать libarchive.dll самостоятельно и добавить ее, а также несколько других .dll, от которых она зависит, в какую-либо папку, распознаваемую вашей системой PATH. - person user136036; 16.01.2020

Я оказался в такой ситуации, когда был вынужден использовать 7z, а также нужно было точно знать, какие файлы были извлечены из каждого zip-архива. Чтобы справиться с этим, вы можете проверить вывод вызова 7z и найти имена файлов. Вот как выглядит вывод 7z:

$ 7z l sample.zip

7-Zip [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21
p7zip Version 16.02 (locale=utf8,Utf16=on,HugeFiles=on,64 bits,8 CPUs x64)

Scanning the drive for archives:
1 file, 472 bytes (1 KiB)

Listing archive: sample.zip

--
Path = sample.zip
Type = zip
Physical Size = 472

   Date      Time    Attr         Size   Compressed  Name
------------------- ----- ------------ ------------  ------------------------
2018-12-01 17:09:59 .....            0            0  sample1.txt
2018-12-01 17:10:01 .....            0            0  sample2.txt
2018-12-01 17:10:03 .....            0            0  sample3.txt
------------------- ----- ------------ ------------  ------------------------
2018-12-01 17:10:03                  0            0  3 files

и как разобрать этот вывод с помощью python:

import subprocess

def find_header(split_line):
    return 'Name' in split_line and 'Date' in split_line

def all_hyphens(line):
    return set(line) == set('-')

def parse_lines(lines):
    found_header = False
    found_first_hyphens = False
    files = []
    for line in lines:

        # After the header is a row of hyphens
        # and the data ends with a row of hyphens
        if found_header:
            is_hyphen = all_hyphens(''.join(line.split()))

            if not found_first_hyphens:
                found_first_hyphens = True
                # now the data starts
                continue

            # Finding a second row of hyphens means we're done
            if found_first_hyphens and is_hyphen:
                return files

        split_line = line.split()

        # Check for the column headers
        if find_header(split_line):
            found_header=True
            continue

        if found_header and found_first_hyphens:
            files.append(split_line[-1])
            continue

    raise ValueError("We parsed this zipfile without finding a second row of hyphens")



byte_result=subprocess.check_output('7z l sample.zip', shell=True)
str_result = byte_result.decode('utf-8')
line_result = str_result.splitlines()
files = parse_lines(line_result)
person Kyle Heuton    schedule 01.12.2018
comment
Обратите внимание, что весь этот код можно сократить до [l.split()[-1] for l in str_result.rsplit("\n\n",1)[-1].splitlines()[2:-2]]. - person bfontaine; 05.10.2019

вы можете использовать библиотеку pyunpack и patool

!pip install pyunpack
!pip install patool
from pyunpack import Archive
Archive('7z file source').extractall('destination')

ссылаться

https://pypi.org/project/patool/
https://pypi.org/project/pyunpack/

person Ruman Khan    schedule 06.11.2019

Обстрел и вызов 7z извлекут файлы, а затем вы сможете open() эти файлы.

Если вы хотите заглянуть внутрь архива 7z непосредственно в Python, вам понадобится библиотека. Вот один из них: https://pypi.python.org/pypi/libarchive — я могу' не ручаюсь за это, как я уже сказал - я не пользователь Python, но использование сторонней библиотеки обычно довольно просто на всех языках.

Как правило, поддержка 7z кажется ограниченной. Если вы можете использовать альтернативные форматы (zip/gzip), я думаю, вы обнаружите, что диапазон библиотек Python (и пример кода) более полный.

Надеюсь, это поможет.

person EyePeaSea    schedule 26.09.2015
comment
На практике использование 7z очень полезно через модуль подпроцесса, вам действительно нужно протестировать команду 7zip из командной строки по отдельности. и полагайтесь на документацию, чтобы правильно структурировать команду. Как только вы поймете, как сформировать команду командной строки 7z, вы будете готовы создать свою команду подпроцесса в Python. - person cdabel; 14.10.2019