IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

[débutant] Dézipper avec 7zip


Sujet :

Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Retraité
    Inscrit en
    Février 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Février 2011
    Messages : 20
    Points : 20
    Points
    20
    Par défaut [débutant] Dézipper avec 7zip
    Bonjour,
    Je découvre Python depuis une semaine et avant de partir dans une formation, je cherche à faire au plus vite un moyen rapide pour dézipper un fichier *.zip déposé dans un répertoire C:\Download (LeCheminDep) dans un dossier D:\LeDossier (LeCheminArr)
    J'utilise Visual Studio Code (1.69.2).
    Je souhaite faire ce dézippage à partir de l'application 7zip pour répondre à la configuration informatique de mes proches (Win 10 et Win 7) qui sont perdus en informatique.
    Voici ce que j'ai déjà fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
            source = os.path.join(LeCheminDep,LeFichier)
            destination = os.path.join(LeCheminArr,LeFichier)
     
            import py7zr
            import brotlicffi as brotli
            with py7zr.SevenZipFile(source, mode='r') as z:
                z.extractall(LeCheminArr)
    C'est quelque chose que j'ai adapté à partir de recherche sur internet, mais j'ai l'erreur : "No module named 'py7zr' ".
    Je pense que je vais avoir la même chose avec "import brotlicffi"
    J'ai compris qu'il fallait que j'installe donc un module mais malgré les explications que j'ai lu, je n'arrive pas à comprendre la méthode.
    Quelqu'un peut il m'expliquer comment faire pas à pas. Et/ou m'indiquer un tuto spécial "très grand débutant python 3 avec Visual Studio Code"
    Merci d'avance

  2. #2
    Invité
    Invité(e)
    Par défaut
    Salut !
    Avec pyunpack !

  3. #3
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour

    Dans la mesure où il y a pas une raison précise d'utiliser 7zip, Python est déjà livré avec un module qui fait ça:

    https://docs.python.org/3/library/zi...module-zipfile

    Et comme il existe depuis longtemps, on doit pouvoir trouver rapidement sur le web des codes exemples pour dézipper.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par MarcoCham Voir le message
    C'est quelque chose que j'ai adapté à partir de recherche sur internet, mais j'ai l'erreur : "No module named 'py7zr' ".
    Oui, c'est un module qui n'est pas intégré par défaut dans Python. Toutefois, comme le dit tyrtamos, il y a déjà des modules dédiés au dezippage des fichiers. Et dans la mesure où ton fichier a été zippé selon un algorithme standard, n'importe quel module de dézippage même celui de base dans Python peut le dézipper.
    Si j'ai bien pigé la doc, faut simplement remplacer with py7zr.SevenZipFile(...) as z par with zipfile.ZipFile(...) as z.

    Citation Envoyé par MarcoCham Voir le message
    J'ai compris qu'il fallait que j'installe donc un module mais malgré les explications que j'ai lu, je n'arrive pas à comprendre la méthode.
    Les modules de la communauté Python sont sur https://pypi.org. Tu peux y trouver py7zr via son champ de recherche et tu arrives rapidement ici: https://pypi.org/project/py7zr/. Là tu as une commande indiquée en haut "pip install py7zr".
    Te suffit de taper cette commande dans une fenêtre MsDos (fenêtre ouverte en mode admin). Et si tu veux être certain de télécharger le module pour Python3 (par opposition à des modules encore disponibles pour Python2) tu remplaces "pip" par "pip3"

    Si maintenant tu veux installer ce module sur un PC qui n'est pas connecté au net, tu as un menu "download files" à gauche. Ce menu t'amène généralement vers deux types de liens
    • les sources du module, stockés dans une archive "tar.gz"
    • le module déjà pré-compilé pour ta version de Python, stocké dans un fichier "whl"

    Tu télécharges l'un ou l'autre (fatalement il te faut un PC connecté au net pour ça, évidemment) puis tu transfères ces fichiers sur le PC qui n'est pas connecté et sur lequel tu veux installer ton module.

    Pour installer depuis les sources, tu les descends dans un dossier, tu te déplaces dans ce dossier et là tu tapes les commandes python3 setup.py build puis python3 setup.py install.
    Pour installer depuis le whl, te suffit de taper la commande pip3 install le_fichier.whl.
    Le seul souci de cette méthode, c'est que si ce module a besoin d'autres modules, avec un PC connecté au net la commande "pip3" va les chercher tout seul, si c'est installé manuellement il faut alors refaire la manip pour les autres modules.

    A noter: tous les modules "xxx" stockés dans pypi possèdent leur archive disponible dans https://pypi.org/simple/xxx. Pour py7zr ce sera dans https://pypi.org/simple/py7zr/. Cela permet, quand la dernière version est trop récente pour ton Python, de trouver des versions précédentes.

    Citation Envoyé par MarcoCham Voir le message
    ...avec Visual Studio Code
    Alors le souci c'est que VS Code est une interface supplémentaire pour Python. Toutes les manips que je t'ai indiquées sont faites pour ceux qui développent depuis le Python de base, directement installé.
    Mais bon normalement l'installation de modules sous VS Code doit être décrite de façon assez explicite un peu partout...

    Citation Envoyé par LeNarvalo Voir le message
    Avec pyunpack !
    Mouais. Pas terrible ton intervention cette fois. Le type il dit qu'il n'arrive pas à installer un module et tu lui donnes le lien d'un autre module...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Invité
    Invité(e)
    Par défaut
    C'est pas faux ! ^^

    Alors un peu mieux :
    1. Laisse tomber VSCode.

    2. Télécharge python 🐍

    3. Lance l'installation

    4. Coche cette case :
    Nom : tuto.png
Affichages : 605
Taille : 95,4 Ko

    5. Poursuis l'installation

    6. Appuies sur Win + R une fois l'installation achevée

    7. Tapes "cmd" (sans les guillemets)

    8. Pour installer un module :
    pip install pynput(par exemple)
    Nom : tuto2.png
Affichages : 603
Taille : 47,8 Ko

    9. Cherche le programme IDLE quelques part ici je suppose :
    %AppData%\Roaming\Microsoft\Windows\Start Menu\Programs\Python310

    10. Lance le programme et ouvre un nouveau fichier :
    Nom : tuto3.png
Affichages : 594
Taille : 20,9 Ko

    11. Pour lancer le script :
    Nom : tuto4.png
Affichages : 595
Taille : 10,9 Ko

  6. #6
    Membre à l'essai
    Homme Profil pro
    Retraité
    Inscrit en
    Février 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Février 2011
    Messages : 20
    Points : 20
    Points
    20
    Par défaut
    Merci, donc je peux me passer de 7zip, c'est une bonne nouvelle.
    L'utilisation du python de base pour écrire les lignes de commande me semble bien austère. C'est peut être une mauvaise opinion que j'ai, il me reste plus qu'à faire un effort.
    bon, il me reste encore beaucoup de route à faire donc je vais essayer/voir tous ça dans quelques jours et je reviendrais alors.
    Merci encore

  7. #7
    Invité
    Invité(e)
    Par défaut
    L'utilisation du python de base pour écrire les lignes de commande me semble bien austère. C'est peut être une mauvaise opinion que j'ai, il me reste plus qu'à faire un effort.
    Programmer, expectations versus reality :

  8. #8
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par MarcoCham Voir le message
    L'utilisation du python de base pour écrire les lignes de commande me semble bien austère. C'est peut être une mauvaise opinion que j'ai,
    Oui, c'est juste un manque d'habitude

    LeNarvalo t'a montré le passage par "idle", un "Python en ligne". Pratique pour tester des instructions simples, mais quand tu commences à coder des gros trucs ça l'est moins.
    Dans ce cas, on passe par un script Python. Un fichier texte d'extension ".py" dans lequel on met tout le code Python.
    Ce fichier doit commencer par...
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #!/usr/bin/env python3
    # coding: utf-8
    ... placé tout au début (enfin il me semble que la seconde est devenue facultative depuis Python3 mais je la laisse quand-même par habitude).

    Ensuite, tu ouvres une fenêtre MsDos et tu tapes python script.py, le fichier "script.py" étant celui qui contient ton code (il te faut être bien entendu à l'endroit où il se trouve). Normalement, ça marche et tu vois ton code s'exécuter.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  9. #9
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour

    Voilà un petit code exemple pour dézipper une archive zip:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
     
    import zipfile
     
    """
    Informations générales sur l'archivage zip, voir:
    https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT
     
    #compress_type = {0:"ZIP_STORED", 8:"ZIP_DEFLATED", 12:"ZIP_BZIP2", 14:"ZIP_LZMA"}
    """
     
    #############################################################################
    def listezip(fichierzip):
        """affiche la liste des fichiers de l'archive. Signale les adresses absolues
        """
        if zipfile.is_zipfile(fichierzip):
            try:
                with zipfile.ZipFile(fichierzip) as fzip:
                    for fichier in fzip.namelist():
                        if fichier[0] in "\\/" or fichier[1]==":":
                            print("Danger: chemin absolu =>", fichier) 
                        else:
                            print(fichier)
            except Exception as msgerr:
                print("Erreur =>", msgerr)
        else:
            print("Ce fichier", fichierzip, "n'est pas une archive valide" )
     
    #############################################################################
    def infozip(fichierzip):
        """Donne des informations sur les fichiers de l'archive "fichierzip"
        """
        compress_type = {0:"ZIP_STORED", 8:"ZIP_DEFLATED", 12:"ZIP_BZIP2", 14:"ZIP_LZMA"}
     
        if zipfile.is_zipfile(fichierzip):
            with zipfile.ZipFile(fichierzip) as fzip:
                for fichier in fzip.namelist():
                    print("="*79)
                    info = fzip.getinfo(fichier)
                    print(info.filename)
                    print()
                    print("date_time:", info.date_time)
                    print("compress_type:", compress_type[info.compress_type]) 
                    print("comment:", info.comment) 
                    print("extra:", info.extra) 
                    print("create_system:", info.create_system) 
                    print("create_version:", info.create_version) 
                    print("extract_version:", info.extract_version) 
                    print("reserved:", info.reserved) 
                    print("flag_bits:", info.flag_bits) 
                    print("volume:", info.volume) 
                    print("internal_attr:", info.internal_attr) 
                    print("info.external_attr:", info.external_attr) 
                    print("header_offset:", info.header_offset)
                    print("CRC:", info.CRC) 
                    print("compress_size:", info.compress_size)
                    print() 
     
        else:
            print("Ce fichier", fichierzip, "n'est pas une archive valide" )
     
    #############################################################################
    def extraitzip(fichierzip, repdest, motdepasse=None):
        """Extrait l'archive zip dans le répertoire destination repdest
           Suppose que les chemins de l'archive sont relatifs (important:
           danger s'ils sont absolus et si origine de l'archive non sûre)
        """
        if zipfile.is_zipfile(fichierzip):
            with zipfile.ZipFile(fichierzip, "r") as fzip:
                for fichier in fzip.namelist():
                    try:
                        fzip.extract(fichier, repdest, motdepasse)
                        print("Extraction de", fichier) 
                    except Exception as msgerr:
                        print("Erreur =>", msgerr)
        else:
            print("Ce fichier", fichierzip, "n'est pas une archive valide" ) 
     
    #############################################################################
    if __name__ == "__main__":
     
        fichierzip = "courrier.zip"
     
        # liste les fichiers de l'archive
        listezip(fichierzip)
        print("*"*79)    
        print()    
     
        # liste les fichiers de l'archive avec leurs propriétés
        infozip(fichierzip)
        print("*"*79)
        print()    
     
        # extraction    
        repdest = r"C:\chemin_vers\temp"
        extraitzip(fichierzip, repdest)
    La fonction listezip(fichierzip) permet de lister les fichiers de l'archive "fichierzip", en signalant les adresses absolues (à compléter si nécessaire pour d'autres types d'adresses, réseau par exemple)

    La fonction infozip(fichierzip) permet de lister les fichiers de l'archive "fichierzip", en donnant des informations sur chaque fichier

    La fonction extraitzip(fichierzip, repdest, motdepasse=None) permet d'extraire les fichiers de l'archive "fichierzip" dans le répertoire "repdest" avec, si nécessaire, le mot de passe.

    fichierzip est ici l'archive zip à dézipper. Comme dit dans le docstring, on suppose que l'archive ne contient que des adresses relatives pour que tout se retrouve dans le répertoire destinataire. Il y a danger si l'archive, d'origine inconnue, contient des adresses absolues!

    Ce n'est qu'un code exemple, dont on peut s'inspirer pour l'adapter à une application particulière.

    [Edit]: je m'aperçois qu'il existe une fonction os.path.isabs(chemin) pour tester si l'adresse est absolue ou non.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  10. #10
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par tyrtamos Voir le message
    Il y a danger si l'archive, d'origine inconnue, contient des adresses absolues!
    Normalement ça n'arrive pas. Les outils zindows (winrar, winzip, 7zip) archivent en relatif, et la commande "tar" de Linux supprime le "/" initial si on demande à archiver un chemin en "/truc/chose"...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  11. #11
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Citation Envoyé par MarcoCham Voir le message
    Je souhaite faire ce dézippage à partir de l'application 7zip pour répondre à la configuration informatique de mes proches (Win 10 et Win 7) qui sont perdus en informatique.
    Lorsqu'on a un exécutable qui se lance en ligne de commande comme 7z, il est plus simple (et rapide) de passer la chaîne de caractères (qu'on pourra tester hors programme Python) directement à subprocess.

    De plus, les implémentations d'un 7zip "standard" et d'une bibliothèque qui "fait pareil" ne sont pas toujours 100% compatibles => on a intérêt à savoir ce qu'on veut et pouvoir le tester avant de switcher.

    Citation Envoyé par MarcoCham Voir le message
    Je découvre Python depuis une semaine et avant de partir dans une formation...
    Se créer des urgences (qu'on est incapable d'assurer) quand on doit prendre le temps...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  12. #12
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour Sve@r

    Citation Envoyé par Sve@r Voir le message
    Normalement ça n'arrive pas. Les outils zindows (winrar, winzip, 7zip) archivent en relatif, et la commande "tar" de Linux supprime le "/" initial si on demande à archiver un chemin en "/truc/chose"...
    En codant soi-même l'archivage, on peut faire que les adresses de l'archive soient absolues, et dans certains cas, ça a du sens. Et j'ai bien dit que le danger était surtout avec les archives d'origine inconnue.

    En fait, on peut ajouter un drapeau comme option supplémentaire à la fonction de dézippage pour savoir si on accepte ou non les adresses absolues. Avec "non" comme mode par défaut. Par exemple: okabs=False.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

Discussions similaires

  1. [Débutant]Commencer avec les BDD
    Par Pill_S dans le forum Débuter
    Réponses: 6
    Dernier message: 29/06/2004, 14h02
  2. [CR 7] [débutante] pb avec if then else
    Par xs_nady dans le forum Formules
    Réponses: 8
    Dernier message: 28/05/2004, 15h36
  3. [débutant] Prob avec Tree ctrl
    Par Devether dans le forum MFC
    Réponses: 3
    Dernier message: 24/03/2004, 11h36
  4. [débutant] Problèmes avec CRegKey
    Par Pedro dans le forum MFC
    Réponses: 4
    Dernier message: 10/11/2003, 15h28
  5. [Débutant] Lenteur avec TComPort
    Par PhDt76 dans le forum C++Builder
    Réponses: 22
    Dernier message: 27/09/2003, 21h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo