web-dev-qa-db-ja.com

pythonを使用して7zファイルの内容を読み取る方法

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)
14
Ken Kem

libarchive または pylzma のいずれかを使用できます。 python3.3 +にアップグレードできる場合は、標準ライブラリにある lzma を使用できます。

10
mr nick

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)
3
Kyle Heuton

シェルアウトして7zを呼び出すとファイルが抽出され、それらのファイルをopen()できます。

Python内で直接7zアーカイブを調べたい場合は、ライブラリを使用する必要があります。 https://pypi.python.org/pypi/libarchive -私が言ったようにそれを保証することはできません-私はPythonユーザー-しかし、サードパーティのライブラリを使用することは、通常、すべての言語で非常に簡単です。

一般的に、7zサポートは制限されているようです。代替形式(Zip/gzip)を使用できる場合、Pythonライブラリ(およびサンプルコード)の範囲がより包括的であることがわかります。

お役に立てば幸いです。

1
EyePeaSea