web-dev-qa-db-fra.com

Comment lire le contenu du fichier 7z en utilisant python

Comment puis-je lire et enregistrer le contenu de 7z. J'utilise Python 2.7.9, je peux extraire ou archiver comme ça, mais je ne peux pas lire le contenu en python, je liste uniquement le contenu du fichier en 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

Vous pouvez utiliser libarchive ou pylzma . Si vous pouvez passer à python3.3 +, vous pouvez utiliser lzma , qui se trouve dans la bibliothèque standard.

10
mr nick

Je me suis retrouvé dans cette situation où j'ai été forcé d'utiliser 7z, et j'avais également besoin de savoir exactement quels fichiers étaient extraits de chaque archive Zip. Pour y faire face, vous pouvez vérifier la sortie de l'appel à 7z et rechercher les noms de fichiers. Voici à quoi ressemble la sortie de 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

et comment analyser cette sortie avec 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

Décortiquer et appeler 7z extraira des fichiers et vous pourrez open() ces fichiers.

Si vous souhaitez regarder à l'intérieur d'une archive 7z directement dans Python, vous devrez utiliser une bibliothèque. En voici un: https://pypi.python.org/pypi/libarchive - Je ne peux pas en témoigner comme je l'ai dit - je ne suis pas un Python utilisateur - mais l'utilisation d'une bibliothèque tierce est généralement assez facile dans toutes les langues.

Généralement, le support 7z semble limité. Si vous pouvez utiliser des formats alternatifs (Zip/gzip), je pense que vous trouverez que la gamme de bibliothèques Python (et exemple de code) est plus complète.

J'espère que ça t'as aidé.

1
EyePeaSea