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 :

zipper un repertoire python 3.4 [Python 3.X]


Sujet :

Python

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    321
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 321
    Points : 109
    Points
    109
    Par défaut zipper un repertoire python 3.4
    bonjour,

    j'essaie de zipper de nombreux répertoire organiser comme suivant ;

    dx
    >>pos
    >>>>pos1.dxf
    >>>>pos2.dxf
    ect
    >>ca
    >>>>ca1.dxf
    >>>>ca2.dxf
    etc

    j'essaie donc de zipper le dossier pos et ca ,séparément dans le dossier dx en sachant que j'ai de nombreux dossiers organiser de cette façon mais qui ne contienne pas tjrs cette extension et je voudrais seulement celle ci..

    j'ai lister les dossiers qui contiennent seulement des dxf avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    def repertoire(path):
    fichier=[]  
        for dirpath, dirnames, filenames in os.walk (path): 
            for filename in filenames:
                 if filename.endswith('.dxf'):
                     fichier.append(dirpath)  
        return fichier
    bon comme il y avait plusieurs dxf cela m'a donné plusieurs fois le même dossier alors je les ai enlevé avec " set ".

    et j'utilise le script ici http://python.developpez.com/faq/?pa...ession-Archive pour zipper.

    pour cette ligne dans la fonction de zippage
    if os.path.isdir(i): _ziprepertoire(zfile, i )

    si j'ai bien compris >> os.path.isdir(i) teste si c'est des dossiers ou des fichiers
    et si c'est des dossiers _ziprepertoire(zfile, i ) zfile enregistre le nom du zip et i le dossier à zipper?

    avec une boucle je peux zipper mes dossiers
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    for row in repertoire(path):
        zipdirectory(row+".zip",row)

    mais bon je crois que c'est très loin d'être optimiser car cela met quand même pas mal de temps ( les fichiers sont plutôt lourd..parfois 2go max)
    est ce que python est aussi la bonne solution...??
    donc si il y a quelqu'un pour me guider un peu ce serait cool..

    merci

  2. #2
    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,

    J'ai peut-être une solution, mais je ne comprends pas tout de la question. En particulier:
    - les noms qui se terminent par .dxf sont des fichiers ou des dossiers?
    - je ne comprends pas ça: < comme il y avait plusieurs dxf cela m'a donné plusieurs fois le même dossier alors je les ai enlevé avec " set ". >

    Je sais zipper un répertoire et son contenu arborescent (sous-répertoires, etc...) avec des options:
    - mettre ou non le 1er répertoire comme racine dans le zip
    - faire que toutes les adresses dans le zip soit relatives (important!)
    - n'inclure que les fichiers sélectionnés par wildcard (exemple: "*.txt;*.pdf")
    - exclure les sous-répertoires sélectionnés par wildcard
    - et bien sûr créer une nouvelle archive ou ajouter à une archive existante.

    Précise un peu ta question, et est-ce que ma solution serait adaptée à ton cas?


    En ce qui concerne le temps d'exécution, je pense que ce sont les mouvements physiques des fichiers sur le disque qui génère le plus de temps, et que le temps d'exécution du code lui-même est négligeable. Donc, le changement de langage n'apporterait pas grand chose.

    A titre d'exemple, voilà ce que fait mon code:
    je zippe un ancien répertoire de développement Python de 33Go (200.000 fichiers et 14.000 répertoires), je n'inclus que les fichiers .py et .pyw, et j'exclus les répertoires utilitaires.
    => J'obtiens un zip qui contient environ 12.000 fichiers et 2.500 répertoires en 47 secondes, ce qui me semble assez rapide pour un répertoire aussi gros.
    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

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    321
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 321
    Points : 109
    Points
    109
    Par défaut
    Bonjour Tyrtamos,

    les noms qui se terminent par .dxf sont des fichiers ou des dossiers?
    >
    des fichiers avec l'extension .dxf

    - je ne comprends pas ça: < comme il y avait plusieurs dxf cela m'a donné plusieurs fois le même dossier alors je les ai enlevé avec " set ".
    comme il y a plusieurs fichiers .dxf dans chaque dossier ma fonction Repertoire me ramenait plusieurs fois le même path..
    j'ai décidé d'enlevé ces doublons après avec ce "set" au lieu de le prévoir directement dans la fonction. j’essayais de décrire ce que je réalisais afin d'avoir une aide pour optimiser au maximum...

    Je sais zipper un répertoire et son contenu arborescent (sous-répertoires, etc...) avec des options:
    - mettre ou non le 1er répertoire comme racine dans le zip
    - faire que toutes les adresses dans le zip soit relatives (important!)
    - exclure les sous-répertoires sélectionnés par wildcard
    oui ce genre de manip m'intéresse alors un peu de doc la dessus peut me faire du bien :-)






    merci

  4. #4
    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
    Voilà le programme que j'utilise. Il est largement auto-documenté (je le fais aussi pour moi!):

    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
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    # Python 3
     
    import os
    import zipfile
    from fnmatch import fnmatch
     
    #############################################################################
    def repertoirezip(repertoire, archive, premier=True, mode="w", inclusfics="*", exclusreps="", repvide=True):
        """zippe l'arborescence complète du répertoire dans le fichier .zip 
           archive avec des chemins relatifs.
           - premier: si True, met le 1er répertoire comme racine de l'arborescence
           - mode: "w" (nouvelle archive) ou "a" (ajout à l'archive existante)
           - inclusfics: motifs "wildcard" d'inclusion des fichiers (séparateur=';')
           - exclusreps: motifs "wildcard" d'exclusion des répertoires (sép.=';')
           - repvide: si True, crée aussi les sous-répertoires vides
           Retourne la liste des éventuelles erreurs de os.walk
        """
        erreurs = [] # pour contenir les erreurs de os.walk
        inclusfics, exclusreps = inclusfics.split(';'), exclusreps.split(';')
        repertoire = os.path.abspath(os.path.expanduser(repertoire))
        baserep = os.path.dirname(repertoire) if premier else repertoire
        with zipfile.ZipFile(archive, mode, zipfile.ZIP_DEFLATED, True) as zf:
            if premier: # écriture du 1er répertoire base de l'arborescence
                zf.write(repertoire, os.path.relpath(repertoire, baserep))
            for rep, sreps, fics in os.walk(repertoire, onerror=erreurs.append):
     
                # retire les sous-répertoires qui matchent avec exclusreps
                for srep in sreps[:]:
                    if [True for motif in exclusreps if fnmatch(srep, motif)]:
                        sreps.remove(srep)
     
                # crée le répertoire, même s'il est vide si c'est demandé
                if rep!=repertoire and repvide:
                    zf.write(rep, os.path.relpath(rep, baserep))
     
                # archive les fichiers qui matchent avec inclusfics
                for fic in fics:
                    if [True for motif in inclusfics if fnmatch(fic, motif)]:
                        fichier = os.path.join(rep, fic)
                        zf.write(fichier, os.path.relpath(fichier, baserep))
        return erreurs
    Exemple d'utilisation:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    repertoire = r"C:\Python34"
    archive = "python34.zip"
    premier = True
    mode = "w"
    inclusfics = "*.py;*.pyw"
    exclusreps = "tcl"
    repvide = True
     
    erreurs = repertoirezip(repertoire, archive, premier, mode, inclusfics, exclusreps, repvide)
    print(erreurs)
    Résultat obtenu en 10 secondes.

    Conformément à ce qui a été demandé (premier=True), le 1er répertoire "Python34" est la racine du zip. Rien n'empêche d'ajouter un autre répertoire racine à cette archive, par exemple un répertoire de développement "pydev", mais il faudra alors que pour cet ajout le mode soit à "a" et non à "w" pour que l'ajout se fasse. On aura alors une archive avec 2 répertoires en racine du zip: "python34" et "pydev".

    Ok?
    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

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    321
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 321
    Points : 109
    Points
    109
    Par défaut
    merci :-) je regarde ça....

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Python 3.X] [MINI-PROJET] Repertoire telephonique sous python
    Par rubisom dans le forum Général Python
    Réponses: 12
    Dernier message: 25/10/2014, 23h02
  2. ASP- Zipper un repertoire
    Par toxycyty dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 01/07/2008, 21h03
  3. Zipper un repertoire avec xp
    Par kinhelios dans le forum C++
    Réponses: 3
    Dernier message: 06/06/2007, 11h34
  4. [Python 2.3.4] Import d'un repertoire dans le parent
    Par efficks dans le forum Général Python
    Réponses: 3
    Dernier message: 23/01/2007, 17h04
  5. repertoire temp dynamique
    Par killpilot dans le forum C
    Réponses: 2
    Dernier message: 26/04/2002, 16h19

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