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 :

Suppression de fichiers à partir d'un ensemble


Sujet :

Python

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Novembre 2007
    Messages
    237
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 237
    Points : 99
    Points
    99
    Par défaut Suppression de fichiers à partir d'un ensemble
    Bonjour à tous,

    Je souhaite supprimer des fichiers issues d'une intersection de deux listes d'ensemble, pour cela je crée un ensemble intersection, puis je sèche, j'ai fais le code ci-dessous mais en fait je n'arrive pas à minipuler les inforamation retourner par ensInter pour supprimer mes fichiers, j'ai le message d'erreur :

    Traceback (most recent call last):
    File "I:\INEOSOL1\compREP\2compREP2.py", line 49, in <module>
    ensemble(repMaitre, repEsclave)
    File "I:\INEOSOL1\compREP\2compREP2.py", line 25, in ensemble
    os.remove(repEsclave+list(ensInter[i]))
    TypeError: 'set' object does not support indexing
    Voici le code

    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
    # fonction de creation des ensembles
    def ensemble(Maitre,Esclave):
        listMaitre = os.listdir(repMaitre)
        listEsclave = os.listdir(repEsclave)
        nbFichiers = len(listMaitre)
        listNouv = []
        ensMaitre = set(listMaitre)
        ensEsclave = set(listEsclave)
        ensInter = ensMaitre & ensEsclave
        print len(list(ensInter))
        # suppression des elemnt en communs
        i = 0
        while i < len(list(ensInter)):
            os.remove(repEsclave+list(ensInter[i]))
            i = i + 1
    Merci de votre aide

  2. #2
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Ce n'est pas plutot ceci ?
    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
     
    #!/usr/bin/env python
    # _*_ coding: utf-8 _*_
    #
    #
    import os
    import shutil
     
    def ensemble(repMaitre, repEsclave):
        listMaitre = os.listdir(repMaitre)
        listEsclave = os.listdir(repEsclave)
        ensInter = []
        for elem in [elem for elem in listMaitre if elem in listEsclave]:
            ensInter.append(elem)
        for f in ensInter:
            todel = os.path.join(repEsclave, f)
            if os.path.isfile(todel):
                os.remove(todel)
            elif os.path.isdir(todel):
                shutil.rmtree(todel)
     
    ensemble(repMaitre, repEsclave)
    @+

    Edit

    Maintenant si c'est juste théorique :
    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
    import os
    import shutil
     
    def ensemble(repMaitre, repEsclave):
        ensMaitre = set(os.listdir(repMaitre))
        ensEsclave = set(os.listdir(repEsclave))
        ensInter = ensMaitre & ensEsclave
        for f in ensInter:
            todel = os.path.join(repEsclave, f)
            if os.path.isfile(todel):
                os.remove(todel)
            elif os.path.isdir(todel):
                shutil.rmtree(todel)
     
    ensemble(repMaitre, repEsclave)
    @+

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 365
    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 365
    Points : 36 900
    Points
    36 900
    Par défaut
    Salut,
    Je ne vois pas l'intérêt de passer par des "set" dans ce cas: il n'y a jamais de doublons et comme de toutes façons le delete descend dans les items, on peut vérifier à ce moment là s'il est ou pas dans la liste de référence.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    import os
     
    def ensemble(repMaitre, repEsclave):
        ensMaitre = os.listdir(repMaitre)
        for name in os.listdir(repEsclave):
            if name in ensMaitre:
                todel = os.path.join(repEsclave, f)
                if os.path.isfile(todel):
                   os.remove(todel)
                elif os.path.isdir(todel):
                   os.removedirs(todel)
     
    ensemble(repMaitre, repEsclave)
    Note: vous êtes sur de vouloir faire aussi os.removedirs(todel)?? Comme il n'y a pas de try-except vous supposez qu'il est "vide" alors que si vous ne détruisez pas tout, il n'a pas de bonne raisons de l'être.
    - W

  4. #4
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Non, surtout pas de removedirs sans test, comme disent les jeunes j'ai bugger (Et je n'ai pas l'edit rapide)
    shutil.rmtree à la limite.

    Mais c'est vrais que la liste est inutile.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    import os
    import shutil
     
    def ensemble(repMaitre, repEsclave):
        ensMaitre = os.listdir(repMaitre)
        for name in [name for name in os.listdir(repEsclave)
                if name in ensMaitre]:
            todel = os.path.join(repEsclave, name)
            if os.path.isfile(todel):    
                os.remove(todel)
            elif os.path.isdir(todel):
                shutil.rmtree(todel)
     
    ensemble(repMaitre, repEsclave)

  5. #5
    Membre régulier
    Homme Profil pro
    Inscrit en
    Novembre 2007
    Messages
    237
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 237
    Points : 99
    Points
    99
    Par défaut
    Merci pour ces réponse. Je pensais que l'utilisation des ensembles était plus rapide.

    Cependant en utilisant les deux codes de PauseKawa appliqués à mon exemple les temps de traitement sont très proches :
    Code 1 : 3.87643552884
    Code 2 : 3.85860335663

    Cependant comme le contenu des répertoires que je teste va croitre régulièrement il faudra suivre l'évolution...

  6. #6
    Membre régulier
    Homme Profil pro
    Inscrit en
    Novembre 2007
    Messages
    237
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 237
    Points : 99
    Points
    99
    Par défaut
    j'ai encore un pb, je souhaite maintenant copier les fichiers restant d'un répertoire vers un autre, pour cela j'ai ajouté :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     # copie des fichiers
        for monfich in glob.glob(repEsclave):
            cpfich=os.path.basename(monfich)
            shutil.copyfile(monfich,repMaitre+cpfich)
    et là j'ai le message :
    Suppression de doublons ONDULEURS
    Traceback (most recent call last):
    File "I:\INEOSOL1\compREP\2compREP4ens.py", line 37, in <module>
    ensemble(repMaitre, repEsclave)
    File "I:\INEOSOL1\compREP\2compREP4ens.py", line 31, in ensemble
    shutil.copyfile(monfich,repMaitre+cpfich)
    File "C:\Python26\lib\shutil.py", line 50, in copyfile
    with open(src, 'rb') as fsrc:
    IOError: [Errno 13] Permission denied: 'I://INEOSOL1//compREP//Temp//OND//'
    alors que mes fichiers ne sont pas utilisés par une autre apllication

  7. #7
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Citation Envoyé par jouclar Voir le message
    Merci pour ces réponse. Je pensais que l'utilisation des ensembles était plus rapide.
    Difficile d'optimiser...
    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
    import os
    import shutil
    import time
     
     
    def ensemble(repMaitre, repEsclave):
        cfile = os.path.isfile
        cdir = os.path.isdir
        delfic = os.remove
        deldir = shutil.rmtree
        listdir = os.listdir
        join = os.path.join
        ensMaitre = listdir(repMaitre)
        for name in [name for name in listdir(repEsclave)
                if name in ensMaitre]:
            todel = join(repEsclave, name)
            if cfile(todel):    
                #delfic(todel)
                print todel
            elif cdir(todel):
                #deldir(todel)
                print todel
     
    def ensemble1(repMaitre, repEsclave):
        ensMaitre = os.listdir(repMaitre)
        for name in [name for name in os.listdir(repEsclave)
                if name in ensMaitre]:
            todel = os.path.join(repEsclave, name)
            if os.path.isfile(todel):    
                #os.remove(todel)
                print todel
            elif os.path.isdir(todel):
                #shutil.rmtree(todel)
                print todel
     
    def ensemble2(repMaitre, repEsclave):
        cfile = os.path.isfile
        cdir = os.path.isdir
        delfic = os.remove
        deldir = shutil.rmtree
        listdir = os.listdir
        join = os.path.join
        repcible = listdir(repMaitre)
        for elem in listdir(repEsclave):
            if elem in repcible:
                todel = join(repEsclave, elem)
                if cfile(todel):    
                    #delfic(todel)
                    print todel
                elif cdir(todel):
                    #deldir(todel)
                    print todel
     
    listf1 = []
    listf2 = []
    listf3 = []
    for i in range(1000):
        reptotest = os.path.expanduser('~')
        t1 = time.clock() 
        ensemble(reptotest, reptotest)
        t2 = time.clock()
        t3 = time.clock() 
        ensemble1(reptotest, reptotest)
        t4 = time.clock()
        t5 = time.clock() 
        ensemble2(reptotest, reptotest)
        t6 = time.clock()
        listf1.append(t2-t1)
        listf2.append(t4-t3)
        listf3.append(t6-t5)
    print max(listf1), min(listf1), sum(listf1)/len(listf1)
    print max(listf2), min(listf2), sum(listf2)/len(listf2)
    print max(listf3), min(listf3), sum(listf3)/len(listf3)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    0.04 0.00999999999999 0.02803
    0.04 0.01 0.02739
    0.05 0.01 0.02746
    ...

  8. #8
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Citation Envoyé par jouclar Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     # copie des fichiers
        for monfich in glob.glob(repEsclave):
            cpfich=os.path.basename(monfich)
            shutil.copyfile(monfich,repMaitre+cpfich)
    The glob module finds all the pathnames matching a specified pattern

    os.path.join(repMaitre, cpfich):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    import glob
    import os
     
    repMaitre = os.path.expanduser('~')
    repEsclave = os.path.expanduser('~')
    for monfich in glob.glob(repEsclave):
        cpfich=os.path.basename(monfich)
        print monfich, os.path.join(repMaitre, cpfich)
        print monfich, repMaitre+cpfich
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    /home/patrice /home/patrice/patrice
    /home/patrice /home/patricepatrice
    @+

  9. #9
    Membre régulier
    Homme Profil pro
    Inscrit en
    Novembre 2007
    Messages
    237
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 237
    Points : 99
    Points
    99
    Par défaut
    Merci PauseKawa

    Existe t il un autre façon de faire une copie de fichiers d'une répertoire vers un autre sans utiliser glob ??

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 365
    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 365
    Points : 36 900
    Points
    36 900
    Par défaut
    Citation Envoyé par PauseKawa Voir le message
    Non, surtout pas de removedirs sans test, comme disent les jeunes j'ai bugger (Et je n'ai pas l'edit rapide)
    Ma préoccupation voulait souligner que comparer une arborescence a d'autres implications que la comparaison "simple" du contenu de deux répertoires.
    Car le contenu du répertoire qu'on se propose de détruire aura été comparé "avant" et on ne le détruit que s'il est vide ou sera comparé après et on n'y touche pas.

    je souhaite maintenant copier les fichiers restant d'un répertoire vers un autre
    Si le répertoire est "vivant" des fichiers de même nom ne seront pas forcément identiques... ce qui complexifie quelque peu "comparer".
    Ceci dit je mettrais comparaison, copie ou destruction dans la même boucle.

    - W

  11. #11
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    +1

    Puisque tu a déjà la comparaison if elem in repcible: un simple else te permet de mettre ta copie dans la même boucle.
    Inutile de parcourir deux fois non ?

    @+

  12. #12
    Membre régulier
    Homme Profil pro
    Inscrit en
    Novembre 2007
    Messages
    237
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 237
    Points : 99
    Points
    99
    Par défaut
    Merci à tous pour votre aide. J'ai effectivement effectué la copie dans la même boucle.

    Voici le code final

    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
    def ensemble(repMaitre, repEsclave):
        cfile = os.path.isfile
        cdir = os.path.isdir
        delfic = os.remove
        deldir = shutil.rmtree
        listdir = os.listdir
        join = os.path.join
        repcible = listdir(repMaitre)
        for elem in listdir(repEsclave):
            if elem in repcible:
                todel = join(repEsclave, elem)
                if cfile(todel):
                    delfic(todel)
                elif cdir(todel):
                    deldir(todel)
            else:
                print 'Copie de :',elem
                src=os.path.join(repEsclave,elem)
                tgt=os.path.join(repMaitre,elem)
                shutil.copy(src,tgt)
    Merci

  13. #13
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonsoir,

    Pour ce qui est des cfile = os.path.isfile et autres c'est dans l'idée qu'un local est plus rapide (voir ton post sur la question de rapidité).
    Citation Envoyé par jouclar Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    def ensemble(repMaitre, repEsclave):
    ....
            else:
                print 'Copie de :',elem
                src=join(repEsclave, elem)
                tgt=join(repMaitre, elem)
                shutil.copy(src,tgt)
    Mais, comme dit plus haut, cela n'apporte pas grand chose dans ce cas.

    Je pense que pour être 'rapide' tu dois respecter trois chose : Local/Built-in/Générer (yield...). C'est un avis.

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

Discussions similaires

  1. Suppression de fichier à partir de SAS
    Par stefsas dans le forum Macro
    Réponses: 3
    Dernier message: 01/10/2015, 10h27
  2. [MySQL] Suppression plusieurs fichiers à partir de bdd
    Par noceb dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 27/02/2013, 00h44
  3. Probleme de suppression des fichiers excel a partir du VB.NET
    Par l_achraf dans le forum Windows Forms
    Réponses: 1
    Dernier message: 23/10/2008, 18h54
  4. Réponses: 4
    Dernier message: 26/01/2006, 12h03
  5. Réponses: 3
    Dernier message: 12/06/2002, 19h03

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