How to read contents of 7z file using python

后端 未结 5 1129
刺人心
刺人心 2020-11-27 20:40

How can I read and save the contents of 7z. I use Python 2.7.9, I can extract or Archive like this, but I can\'t read contents in python, I only listing the file\'s contents

相关标签:
5条回答
  • 2020-11-27 21:21

    If you can use python 3, there is a useful library, py7zr, which supports 7zip archive compression, decompression, encryption and decryption.

    import py7zr
    with py7zr.SevenZipFile('sample.7z', mode='r') as z:
        z.extractall()
    
    0 讨论(0)
  • 2020-11-27 21:23

    Shelling out and calling 7z will extract files and then you can open() those files.

    If you want to look inside a 7z archive directly within Python, then you'll need to use a library. Here's one: https://pypi.python.org/pypi/libarchive - I can't vouch for it as I said - I'm not a Python user - but using a 3rd party library is usually pretty easy in all languages.

    Generally, 7z Support seems limited. If you can use alternative formats (zip/gzip) then I think you'll find the range of Python libraries (and example code) is more comprehensive.

    Hope that helps.

    0 讨论(0)
  • 2020-11-27 21:25

    You can use either libarchive or pylzma. If you can upgrade to python3.3+ you can use lzma, which is in the standard library.

    0 讨论(0)
  • 2020-11-27 21:35

    I ended up in this situation where I was forced to use 7z, and also needed to know exactly which files were extracted from each zip archive. To deal with this, you can check the output of the call to 7z and look for the filenames. Here's what the output of 7z looks like:

    $ 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
    

    and how to parse that output with 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)
    
    0 讨论(0)
  • 2020-11-27 21:35

    you can Use pyunpack and patool library

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

    refer

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

    0 讨论(0)
提交回复
热议问题