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 :

Optimiser un filtrage multiple sur des listes.


Sujet :

Python

  1. #1
    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 Optimiser un filtrage multiple sur des listes.
    Bonjour,

    J'ai une class pour rechercher des fichiers ou dossiers et j'ai un petit souci de lenteur dans la rapidité de mes traitements. J'utilise os.listdir ou os.walk suivant les options choisis par l'utilisateur mais dans le cadre d'un os.walk le temps de tri sur les résultats est bien trop important par rapport à l'os.walk en lui même (c'est visible au niveau du temps de traitement et au voyant d'activité du disque).

    Voici comment cela se passe :

    Dans un premier temps j'ai un Toplevel Tkinter (mais ce n'est pas le sujet) wiClassRechercher avec des Checkbutton pour définir des options de recherche ([img=http://img171.imageshack.us/img171/6343/interfce.th.png])
    Après validation et d'après les StringVar je fais un wiClassRechercher.withdraw() et je crée un Toplevel wiResultRecherche que je withdraw aussi dans l'attente de mes résultats.

    Donc pour en venir au traitement proprement dit je procède de cette manière :

    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
                    if Checkcourrant_Checkbutton_StringVar.get() == "yes":
                        listresult = []
                        listtmp = os.listdir(os.getcwd())
                        for items in listtmp:
                            CheminItem = os.path.join(os.getcwd(), items)
                            if CheminItem == CheminItem.replace('/.','/'):
                                if Checktous_Checkbutton_StringVar.get() == "yes" and items[-1] != '~':
                                    listresult.append(CheminItem)
                                elif Checkfonly_Checkbutton_StringVar.get() == "yes" and items[-1] != '~' and os.path.isfile(CheminItem):
                                    listresult.append(CheminItem)
                                elif Checkdonly_Checkbutton_StringVar.get() == "yes" and os.path.isdir(CheminItem):
                                    listresult.append(CheminItem)
                    elif Checkrepsous_Checkbutton_StringVar.get() == "yes":
                        listresult = []
                        for root, dirs, files in os.walk(os.getcwd()):
                            RalentRecherche += 1
                            if RalentRecherche == 100:
                                IndRecherche += 1
                                if IndRecherche == 190: IndRecherche = 0
                                PgBarre.Maj_Recherche(IndRecherche)
                                RalentRecherche = 0
                            TriResult(root, dirs, files)
                    elif Checkperso_Checkbutton_StringVar.get() == "yes":
                        listresult = []
                        for root, dirs, files in os.walk(os.environ['HOME']):
                            RalentRecherche += 1
                            if RalentRecherche == 100:
                                IndRecherche += 1
                                if IndRecherche == 190: IndRecherche = 0
                                PgBarre.Maj_Recherche(IndRecherche)
                                RalentRecherche = 0
                            TriResult(root, dirs, files)
                    for items in listresult:
                        RalentRecherche += 1
                        if RalentRecherche == 100:
                            IndRecherche += 1
                            if IndRecherche == 190: IndRecherche = 0
                            PgBarre.Maj_Recherche(IndRecherche)
                            RalentRecherche = 0
                        if Checkcomplet_Checkbutton_StringVar.get() == "yes":
                            if Checkcase_Checkbutton_StringVar.get() == "yes" and str(os.path.basename(items)) == str(Entry_Recherche_StringVar.get()):
                                result.append(items)
                            elif Checkcase_Checkbutton_StringVar.get() == "no" and str(os.path.basename(items)).lower() == str(Entry_Recherche_StringVar.get()).lower():
                                result.append(items)
                        else:
                            if len(str(Entry_Recherche_StringVar.get())) < len(str(os.path.basename(items))) + 1:
                                Val_Ind = 0
                                while (Val_Ind < len(str(os.path.basename(items)))-len(str(Entry_Recherche_StringVar.get())) + 1):
                                    if Checkcase_Checkbutton_StringVar.get() == "yes":
                                        if str(os.path.basename(items))[Val_Ind:len(str(Entry_Recherche_StringVar.get()))+Val_Ind] == str(Entry_Recherche_StringVar.get()):
                                            result.append(items)
                                            break
                                    else:
                                        if str(os.path.basename(items))[Val_Ind:len(str(Entry_Recherche_StringVar.get()))+Val_Ind].lower() == str(Entry_Recherche_StringVar.get()).lower():
                                            result.append(items)
                                            break
                                    Val_Ind += 1 
                    for items in result:
                        RalentRecherche += 1
                        if RalentRecherche == 100:
                            IndRecherche += 1
                            if IndRecherche == 190: IndRecherche = 0
                            PgBarre.Maj_Recherche(IndRecherche)
                            RalentRecherche = 0
                        ListResultRecherche.insert(END, items)
                        if os.path.isfile(items):
                            ListResultRecherche.itemconfig(ListResultRecherche.size() - 1, fg='#2a7aff', selectforeground = '#2a7aff')
                    wiResultRecherche.deiconify()
                    wiClassRechercher.destroy()
    Ce qui me fais déjà un traitement de trois listes plus le Def TriResult que voici... :

    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 TriResult(root, dirs, files):
                    if Checkfonly_Checkbutton_StringVar.get() == "yes":
                        for items in files:
                            CheminFiles = os.path.join(root, items)
                            if CheminFiles == CheminFiles.replace('/.','/') and items[-1:] != '~':
                                listresult.append(CheminFiles)
                    elif Checkdonly_Checkbutton_StringVar.get() == "yes":
                        for items in dirs:
                            CheminDir = os.path.join(root, items)
                            if CheminDir == CheminDir.replace('/.','/'):
                                listresult.append(CheminDir)
                    else:
                        for items in files:
                            CheminFiles = os.path.join(root, items)
                            if CheminFiles == CheminFiles.replace('/.','/') and items[-1:] != '~':
                                listresult.append(CheminFiles)
                        for items in dirs:
                            CheminDir = os.path.join(root, items)
                            if CheminDir == CheminDir.replace('/.','/'):
                                listresult.append(CheminDir)
    Pour ce qui est de PgBarre ([img=http://img406.imageshack.us/img406/1214/captureah.th.png]) j'ai mis cela en place le temps de trouver une solution pour accélérer tout cela (et faire patienter l'utilisateur). En voici toutefois le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PgBarre = BarreProgress(IndRecherche, lanceur)
    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
    class BarreProgress(Toplevel):
     
        def __init__(self, IndRecherche, lanceur):
            Toplevel.__init__(self, IndRecherche)
            self.withdraw()
            global TmpAttendCanvas
            global BarreBleu
            global wiTmpAttend
            if lanceur == 'Zip': # Non utiliser pour le moment.
                TextBarre = u'Archivage en cours...'
            elif lanceur == 'Recherche':
                TextBarre = 'Recherche en cours...'
            elif lanceur == 'Tempo':
                TextBarre = u'Vérification en cours...'
            wiTmpAttend = Toplevel()
            wiTmpAttend.overrideredirect(1)
            wt = wiTmpAttend.winfo_screenwidth()
            ht = wiTmpAttend.winfo_screenheight()
            wiTmpAttend.geometry("%dx%d+%d+%d" % (200,90, (wt-200)/2, (ht-90)/2 ) )
            BordureTmpAttend = Frame(wiTmpAttend, bd=2, relief=GROOVE)
            BordureTmpAttend.place(x=1, y=1, relwidth = 1, relheight = 1, bordermode="inside")
            Label(BordureTmpAttend, fg = "red", text = os.linesep + TextBarre + os.linesep).pack(side=TOP)
            TmpAttendCanvas = Canvas(BordureTmpAttend, height=20, width=180, bg='white', bd=2, relief=SUNKEN)
            TmpAttendCanvas.pack(side=TOP)
            BarreBleu = TmpAttendCanvas.create_rectangle((IndRecherche, 0, 20 + IndRecherche, 20), outline='#2a7aff',fill='#2a7aff', width=2)
     
        def Maj_Recherche(self, IndRecherche):
            TmpAttendCanvas.coords(BarreBleu, (IndRecherche, 0, 20 + IndRecherche, 20))
            TmpAttendCanvas.update_idletasks()
     
        def BarreQuit(self):
            wiTmpAttend.destroy()
    Et pour finir j'affiche donc mon Toplevel wiResultRecherche ([img=http://img30.imageshack.us/img30/2971/capture1u.th.png]).

    Comment réduire tous ses traitements ? En fait j'ai besoin des résultats du tri de la liste précédente pour la filtrer sur la suivante donc je cale sur la manière de procéder...

    Pour la partie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
                    else:
                        for items in files:
                            CheminFiles = os.path.join(root, items)
                            if CheminFiles == CheminFiles.replace('/.','/') and items[-1:] != '~':
                                listresult.append(CheminFiles)
                        for items in dirs:
                            CheminDir = os.path.join(root, items)
                            if CheminDir == CheminDir.replace('/.','/'):
                                listresult.append(CheminDir)
    j'ai bien penser aux threads, un pour files et un pour dirs, mais est il raisonnable de faire cela sur la même liste ? (Je n'ai pas l'habitude des threads)

    Merci
    Merci d'utiliser le forum pour les questions techniques.

  2. #2
    Membre éprouvé
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Points : 1 066
    Points
    1 066
    Par défaut
    Si j'ai bien compris, tu veux lister les fichiers et dossiers non cachés.
    Or, os.walk va tout faire, sans exception.
    Le mieux serait de tenir deux listes:
    1. les éléments trouvés
    2. les éléments à explorer

    Tu démarres alors en mettant le dossier de base dans la liste à explorer, et tant qu'il y a des éléments dans cette liste, tu explores.
    Et quand tu trouves un dossier non caché, tu le rajoutes à cette liste.
    Enfin, je dis liste, mais du coup tu t'en servirais comme une queue.
    De cette manière, tu évites de te plonger dans les méandres des dossiers cachés, c'est déjà ça de gagné.


    De plus, ta fonction TriResult est un peu mal nommée puisqu'il s'agit plus d'un filtrage que d'un tri, mais c'est vrai que "tri" est asse vague.

    Tu pourrais simplifier la condition suivante, et du coup supprimer le os.path.join
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CheminFiles == CheminFiles.replace('/.','/')
    # Tu sais que tu fais toujours un os.path.join avec le root.
    # Donc, si le root n'est pas caché, il est inutile de le vérifier une fois encore
    # On peut donc simplifier par ceci:
    item[0] == '.'
     
    # Aussi,
    item[-1:]
    # est équivalent, mais peut-être un rien plus lent à
    item[-1]
    Toujours dans TriResult, tu accèdes à une variable listresult. Est-elle en scope global, ou de classe ? C'est plus efficace de la prendre en variable locale. Ou mieux, tu peux juste garder une référence vers sa méthode append
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    append = listresult.app
    append(1)
    append(2)
    Aussi, tu pourrais utiliser la fonction filter à la place de tes boucles for. Ca aurait en tout cas pour effet de simplifier ton code, et sans doute de le rendre plus rapide


    Il serait possible de tirer parti des threads pour ce traitement, en théorie du moins. Hélas Python a ce qu'on appelle un GIL qui rend les threads standard de python complètement inutiles pour améliorer les performances. Il existe le module multiprocessing, qui pourrait t'aider, mais ce n'est pas une solution miracle.

  3. #3
    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
    Ce n'est pas le root mais le résultat d'un for root, dirs, files in os.walk(item).
    C'est donc le chemin jusqu'à un répertoire (qui se trouve dans la liste dirs) ou un fichier (stocké dans files).
    A un moment donné le chemin risque de se retrouver dans un répertoire caché, surtout si c'est un os.walk sur os.environ['HOME'] ou l'on retrouve les dossiers de configuration des applications.
    J'occulte donc ses résultats.
    Merci d'utiliser le forum pour les questions techniques.

  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
    Citation Envoyé par Antoine_935 Voir le message
    Si j'ai bien compris, tu veux lister les fichiers et dossiers non cachés.
    Or, os.walk va tout faire, sans exception.
    Le mieux serait de tenir deux listes:
    1. les éléments trouvés
    2. les éléments à explorer

    Tu démarres alors en mettant le dossier de base dans la liste à explorer, et tant qu'il y a des éléments dans cette liste, tu explores.
    Et quand tu trouves un dossier non caché, tu le rajoutes à cette liste.
    Enfin, je dis liste, mais du coup tu t'en servirais comme une queue.
    De cette manière, tu évites de te plonger dans les méandres des dossiers cachés, c'est déjà ça de gagné.
    L'idée est bonne mais de la à la mettre en pratique...
    Je vais réfléchir à la chose bien que pour le moment je ne vois pas comment procéder.

    Citation Envoyé par Antoine_935 Voir le message
    Tu pourrais simplifier la condition suivante, et du coup supprimer le os.path.join
    [code]CheminFiles == CheminFiles.replace('/.','/')
    Ce n'est valable que si je supprime la recherche dans les dossiers cachés comme dit si dessus et dans ce cas je n'ai qu'a faire la vérification sur les fichiers.

    Citation Envoyé par Antoine_935 Voir le message
    Toujours dans TriResult, tu accèdes à une variable listresult. Est-elle en scope global, ou de classe ? C'est plus efficace de la prendre en variable locale. Ou mieux, tu peux juste garder une référence vers sa méthode append
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    append = listresult.app
    append(1)
    append(2)
    C'est une locale du parent.

    Citation Envoyé par Antoine_935 Voir le message
    Aussi, tu pourrais utiliser la fonction filter à la place de tes boucles for. Ca aurait en tout cas pour effet de simplifier ton code, et sans doute de le rendre plus rapide


    Il serait possible de tirer parti des threads pour ce traitement, en théorie du moins. Hélas Python a ce qu'on appelle un GIL qui rend les threads standard de python complètement inutiles pour améliorer les performances. Il existe le module multiprocessing, qui pourrait t'aider, mais ce n'est pas une solution miracle.
    Bon, il ne reste qu'a tester tout cela (si je trouve ).

    Merci pour les idées en tout cas.
    Merci d'utiliser le forum pour les questions techniques.

  5. #5
    Membre éprouvé
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Points : 1 066
    Points
    1 066
    Par défaut
    Citation Envoyé par PauseKawa Voir le message
    Ce n'est valable que si je supprime la recherche dans les dossiers cachés comme dit si dessus et dans ce cas je n'ai qu'a faire la vérification sur les fichiers.
    Non, c'est quand même toujours le même dossier avec lequel tu fais le os.path.join. Si vraiment tu tiens à faire cette vérification, fais le une seule fois en début de fonction, mais pas pour chaque fichier.

    C'est une locale du parent.
    Euh... j'en devine que c'est une variable de classe ? ou alors tu as une closure, ou euh...
    En tous les cas, l'accès aux variables locales (locales locales... direct quoi, ya pas d'autres locales) est toujours plus rapide que les autres accès.

  6. #6
    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 Antoine_935 Voir le message
    Non, c'est quand même toujours le même dossier avec lequel tu fais le os.path.join. Si vraiment tu tiens à faire cette vérification, fais le une seule fois en début de fonction, mais pas pour chaque fichier.
    C'est la que je ne trouve pas comment faire : comment parcourir un répertoire et ses sous répertoires en excluant les dossiers cachés (et ne pas les parcourirs) et inclure cela dans une liste.

    Citation Envoyé par Antoine_935 Voir le message
    Euh... j'en devine que c'est une variable de classe ? ou alors tu as une closure, ou euh...
    En tous les cas, l'accès aux variables locales (locales locales... direct quoi, ya pas d'autres locales) est toujours plus rapide que les autres accès.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        Def parent(...):
     
            Def enfant(...):
                 traite x
     
            x = cequetuveux
    Merci d'utiliser le forum pour les questions techniques.

  7. #7
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Points : 1 658
    Points
    1 658
    Par défaut
    Hello,

    Je ne comprends pas l’idée à l’origine du test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if CheminItem == CheminItem.replace('/.','/'):


    J’ai fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    os.chdir('C:\Documents and Settings\Administrator')
    listtmp = os.listdir(os.getcwd())
    for items in listtmp:
        CheminItem = os.path.join(os.getcwd(), items)
        print CheminItem, CheminItem == CheminItem.replace('/.','/')
    et j’obtiens des CheminItem == CheminItem.replace('/.','/') égaux à True pour TOUS les fichiers et dossiers,
    alors qu’il y a des fichiers et dossiers cachés dans ce répertoire.


    Antoine, qu’est ce qui te fait penser que Kawa veut lister les fichiers et dossiers non cachés, stp ?

  8. #8
    Membre éprouvé
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Points : 1 066
    Points
    1 066
    Par défaut
    Pour ne parcourir que les fichiers et dossiers non cachés, il te suffit de ne pas utiliser os.walk, mais plutôt os.listdir. Ce dernier n'est pas récursif.
    Donc, pour chaque dossier que tu listes, tu dois retrouver les sous dossiers qui ne sont pas cachés, et les rajouter à la liste des éléments devant être explorés.

    Exemple rapide:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    aExplorer = []
    aExplorer.append(leDossierDeBase)
     
    while aExplorer:
        dossierAVisiter = aExplorer.sortirPremierElement()
        dossiers, fichiers = lireDossier(dossierAVisiter)
     
        aExplorer.ajouterLesDossiersNonCachés(dossiers)
    Citation Envoyé par PauseKawa Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        Def parent(...):
     
            Def enfant(...):
                 traite x
     
            x = cequetuveux
    Tu as donc une closure (ou "fermeture" en français). listresult n'est donc plus une variable locale, et son accès est plus lent.

    Citation Envoyé par eyquem Voir le message
    Antoine, qu’est ce qui te fait penser que Kawa veut lister les fichiers et dossiers non cachés, stp ?
    Sous linux (et *nix en général), les fichiers cachés sont marqués par un nom commençant par un point.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    In [8]: path = "/home/antoine/.gimp"
     
    In [9]: path.replace("/.", "/")
    Out[9]: '/home/antoine/gimp'

  9. #9
    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 eyquem Voir le message
    Hello,

    Je ne comprends pas l’idée à l’origine du test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if CheminItem == CheminItem.replace('/.','/'):


    J’ai fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    os.chdir('C:\Documents and Settings\Administrator')
    listtmp = os.listdir(os.getcwd())
    for items in listtmp:
        CheminItem = os.path.join(os.getcwd(), items)
        print CheminItem, CheminItem == CheminItem.replace('/.','/')
    et j’obtiens des CheminItem == CheminItem.replace('/.','/') égaux à True pour TOUS les fichiers et dossiers,
    alors qu’il y a des fichiers et dossiers cachés dans ce répertoire.


    Antoine, qu’est ce qui te fait penser que Kawa veut lister les fichiers et dossiers non cachés, stp ?
    Bonjour eyquem,

    Puisque Antoine_935 est timide j'en profite pour te recommander cette lecture : http://www.developpez.net/forums/d80...r/#post4626592
    Merci d'utiliser le forum pour les questions techniques.

  10. #10
    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 Antoine_935 Voir le message
    Pour ne parcourir que les fichiers et dossiers non cachés, il te suffit de ne pas utiliser os.walk, mais plutôt os.listdir. Ce dernier n'est pas récursif.
    Donc, pour chaque dossier que tu listes, tu dois retrouver les sous dossiers qui ne sont pas cachés, et les rajouter à la liste des éléments devant être explorés.

    Exemple rapide:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    aExplorer = []
    aExplorer.append(leDossierDeBase)
     
    while aExplorer:
        dossierAVisiter = aExplorer.sortirPremierElement()
        dossiers, fichiers = lireDossier(dossierAVisiter)
     
        aExplorer.ajouterLesDossiersNonCachés(dossiers)
    Cela vas alors, j'avais commancer dans ce sens
    Par contre je me demande si c'est vraiment plus rapide.
    Mon problème n'est pas temps le os.walk mais son traitement.
    Ne vais je pas perdre à faire mes fichiers un à un pour gagner de l'autre coté ?
    A tester donc.
    J'y retourne.

    Citation Envoyé par Antoine_935 Voir le message
    Tu as donc une closure (ou "fermeture" en français). listresult n'est donc plus une variable locale, et son accès est plus lent.
    Il n'est jamais trop tard pour apprendre. Je ne connaissais pas l'expression mais c'est une solution que j'avais trouver de mon coté pour éviter les globals. Finalement je n'ai pas inventer le fil a couper le beurre
    Merci d'utiliser le forum pour les questions techniques.

  11. #11
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Points : 1 658
    Points
    1 658
    Par défaut
    Merci Antoine, merci Kawa,

    J’aurais pu comprendre tout seul quand même...
    Plutôt que ton lien, Kawa, il y a un post récent de tyrtamos dans lequel on apprend plus directement que le point initial signale un fichier/dossier caché en Linux:
    http://www.developpez.net/forums/d80...r/#post4621237
    C’est seulement après la réponse de Antoine que ça m’est revenu. pfff...




    os.getcwd() renvoyant toujours le même chemin tant qu’on n’a pas fait exécuter une instruction os.chdir() ,
    il est tout à fait vrai qu’il y a fort peu de raison de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CheminItem = os.path.join(os.getcwd(), items)
    puisque ça consiste finalment à ajouter un caractère ’/’ devant le premier caractère de items
    (pourquoi un s à items ?)
    Comme le dit Antoine, un test sur item[0] me semble amplement suffisant, non ?





    Je ne comprends pas une autre chose:
    à quoi correspond items[-1] égal ou non à ~??

  12. #12
    Membre éclairé
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Points : 773
    Points
    773
    Par défaut
    Citation Envoyé par PauseKawa Voir le message
    C'est la que je ne trouve pas comment faire : comment parcourir un répertoire et ses sous répertoires en excluant les dossiers cachés (et ne pas les parcourirs) et inclure cela dans une liste.
    Une fonction récursive parait on ne peut plus adaptée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    def allFilesButHiden(rootPath):
        '''It is important to have the '/' at the end of the rootPath'''
        for elem in os.listdir(rootPath):
            if elem[0]!='.':
                if os.path.isdir(rootPath+elem):
                    for e in allFilesButHiden(rootPath+elem+'/'):
                        yield rootPath+elem+'/'+e
                else:
                    yield elem
    Elle est peut-être à modifier légèrement, cause je suis parti de l'hypothèse que tu ne voulais pas non plus obtenir les FICHIERS cachés

    exemple d'utilisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    not_hidden_files=list(allFilesButHiden('~/'))

  13. #13
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Points : 1 658
    Points
    1 658
    Par défaut
    Pour mettre un peu plus de rapidité dans la lenteur du problème ,
    j’ai fait apparaître des list comprehension dans le code
    et je l’ai réorganisé pour éliminer les lignes en double.

    Comme je n’ai pas compris à quoi servent les lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            RalentRecherche += 1
            if RalentRecherche == 100:
                IndRecherche += 1
                if IndRecherche == 190: IndRecherche = 0
                PgBarre.Maj_Recherche(IndRecherche)
                RalentRecherche = 0
    et que j’ai cru comprendre qu’elles sont provisoires,
    elles ne sont pas dans ma proposition:


    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
                    if Checkcourrant_Checkbutton_StringVar.get() == "yes":                
                        if Checktous_Checkbutton_StringVar.get() == "yes":
                            listresult = [ item for item in os.listdir(os.getcwd()) if items[-1] != '~' ]
                        elif Checkfonly_Checkbutton_StringVar.get() == "yes":
                            listresult = [ item for item in os.walk(os.getcwd()).next()[2] if items[-1] != '~' ]
                        elif Checkdonly_Checkbutton_StringVar.get() == "yes":
                            listresult = os.walk(os.getcwd()).next()[1]
     
                    else:
                        if Checkrepsous_Checkbutton_StringVar.get() == "yes":
                            to_walk = os.getcwd()
                        if Checkperso_Checkbutton_StringVar.get() == "yes":
                            to_walk = os.environ['HOME']
     
                        if Checkfonly_Checkbutton_StringVar.get() == "yes":
                            listresult = [ root+'/'+f for root,dirs,files in os.walk(to_walk) for f in files if f[0]!='.' and f[-1] != '~' ]
                        elif Checkdonly_Checkbutton_StringVar.get() == "yes":
                            listresult = [ root+'/'+d for root,dirs,files in os.walk(to_walk) for d in dirs if d[0]!='.' ]
                        else:
                            listresult = []
                            for root,dirs,files in os.walk(to_walk):
                                listresult.extend([ root+'/'+f for f in files if f[0]!='.' and f[-1] != '~' ])
                                listresult.extend([ root+'/'+d for d in dirs if d[0]!='.' ])
    Je n’ai pas encore examiné la suite, c’est à dire ce qu’on fait ensuite de listresult.
    Je pense qu’il doit être possible de faire le même genre de raccourcis dans cette suite et entre cette suite et ce qui la précède.

  14. #14
    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
    Ok, la class au complet (c'est en cours )

    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
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    class Recherche(Frame):
     
        def __init__(self, master):
     
            def Butannuler_Button_Click(event = None):
                wiClassRechercher.destroy()
     
            def Butrechercher_Button_Click(event = None):
                result =[]
     
                def TriResult(root, dirs, files):
                    if Checkfonly_Checkbutton_StringVar.get() == "yes":
                        for items in files:
                            CheminFiles = os.path.join(root, items)
                            if CheminFiles == CheminFiles.replace('/.','/') and items[-1:] != '~':
                                listresult.append(CheminFiles)
                    elif Checkdonly_Checkbutton_StringVar.get() == "yes":
                        for items in dirs:
                            CheminDir = os.path.join(root, items)
                            if CheminDir == CheminDir.replace('/.','/'):
                                listresult.append(CheminDir)
                    else:
                        for items in files:
                            CheminFiles = os.path.join(root, items)
                            if CheminFiles == CheminFiles.replace('/.','/') and items[-1:] != '~':
                                listresult.append(CheminFiles)
                        for items in dirs:
                            CheminDir = os.path.join(root, items)
                            if CheminDir == CheminDir.replace('/.','/'):
                                listresult.append(CheminDir)
     
                if Entry_Recherche_StringVar.get() != '':
     
                    def Vider_ResultRecherche(event = None):
                        lanceur = 'vider'
                        for items in result:
                            Nom_Recherche = os.path.basename(items)
                            count = 1
                            while (count < 10000):
                                Verif_Exist = Corbeille + os.sep + Nom_Recherche + '.' + str(count)
                                if os.path.exists(Verif_Exist):
                                    count += 1
                                else:
                                    shutil.move(items, Verif_Exist)
                                    break
                        self.master.RechercheQuit(lanceur)
                        wiResultRecherche.destroy()
     
                    def ResultRecherche_Ouvrir(event = None):
                        Select_Recherche = ''
                        index = ListResultRecherche.curselection()
                        if index:
                            try:
                                if index[1]:
                                    wiErreurSelectRecherche = Toplevel()
                                    wt = wiErreurSelectRecherche.winfo_screenwidth()
                                    ht = wiErreurSelectRecherche.winfo_screenheight()
                                    wiErreurSelectRecherche.geometry("%dx%d+%d+%d" % (300, 90, (wt-300)/2, (ht-90)/2 ) )
                                    wiErreurSelectRecherche.resizable(False,False)
                                    wiErreurSelectRecherche.title(u'Erreur de sélection')
                                    Label(wiErreurSelectRecherche, fg='red', text=os.linesep + u'Action impossible sur une sélection multiple.' + os.linesep).pack(side=TOP)
                                    Button(wiErreurSelectRecherche, text="Ok", fg='dark slate blue', activebackground='white', activeforeground='#2a7aff', command = wiErreurSelectRecherche.destroy).pack(side=BOTTOM, pady=5)
                                    wiErreurSelectRecherche.bind('<Escape>', wiErreurSelectRecherche.destroy )
                            except: Select_Recherche = ListResultRecherche.get(index)
                            if Select_Recherche:
                                if os.path.isdir(Select_Recherche):
                                    os.chdir(Select_Recherche)
                                    lanceur = 'change'
                                    self.master.RechercheQuit(lanceur)
                                    wiResultRecherche.destroy()
                                elif os.path.isfile(Select_Recherche):
                                    os.chdir(os.path.dirname(Select_Recherche))
                                    lanceur = Select_Recherche
                                    self.master.RechercheQuit(lanceur)
                                    wiResultRecherche.destroy()
                        else:
                            wiErreurSelectRecherche = Toplevel()
                            wt = wiErreurSelectRecherche.winfo_screenwidth()
                            ht = wiErreurSelectRecherche.winfo_screenheight()
                            wiErreurSelectRecherche.geometry("%dx%d+%d+%d" % (230, 90, (wt-230)/2, (ht-90)/2 ) )
                            wiErreurSelectRecherche.resizable(False,False)
                            wiErreurSelectRecherche.title(u'Erreur de sélection')
                            Label(wiErreurSelectRecherche, fg='red', text=os.linesep + u'Choisissez un élément.' + os.linesep).pack(side=TOP)
                            Button(wiErreurSelectRecherche, text="Ok", fg='dark slate blue', activebackground='white', activeforeground='#2a7aff', command = wiErreurSelectRecherche.destroy).pack(side=BOTTOM, pady=5)
                            wiErreurSelectRecherche.bind('<Escape>', wiErreurSelectRecherche.destroy )
     
                    def ResultRecherche_Deplace(event = None):
                        Select_Recherche = ''
                        index = ListResultRecherche.curselection()
                        if index:
                            try:
                                if index[1]:
                                    wiErreurSelectRecherche = Toplevel()
                                    wt = wiErreurSelectRecherche.winfo_screenwidth()
                                    ht = wiErreurSelectRecherche.winfo_screenheight()
                                    wiErreurSelectRecherche.geometry("%dx%d+%d+%d" % (300, 90, (wt-300)/2, (ht-90)/2 ) )
                                    wiErreurSelectRecherche.resizable(False,False)
                                    wiErreurSelectRecherche.title(u'Erreur de sélection')
                                    Label(wiErreurSelectRecherche, fg='red', text=os.linesep + u'Action impossible sur une sélection multiple.' + os.linesep).pack(side=TOP)
                                    Button(wiErreurSelectRecherche, text="Ok", fg='dark slate blue', activebackground='white', activeforeground='#2a7aff', command = wiErreurSelectRecherche.destroy).pack(side=BOTTOM, pady=5)
                                    wiErreurSelectRecherche.bind('<Escape>', wiErreurSelectRecherche.destroy )
                            except: Select_Recherche = ListResultRecherche.get(index)
                            if Select_Recherche:
                                if os.path.isdir(Select_Recherche):
                                    os.chdir(Select_Recherche)
                                    lanceur = 'change'
                                    self.master.RechercheQuit(lanceur)
                                    wiResultRecherche.destroy()
                                elif os.path.isfile(Select_Recherche):
                                    os.chdir(os.path.dirname(Select_Recherche))
                                    lanceur = 'change'
                                    self.master.RechercheQuit(lanceur)
                                    wiResultRecherche.destroy()
                        else:
                            wiErreurSelectRecherche = Toplevel()
                            wt = wiErreurSelectRecherche.winfo_screenwidth()
                            ht = wiErreurSelectRecherche.winfo_screenheight()
                            wiErreurSelectRecherche.geometry("%dx%d+%d+%d" % (230, 90, (wt-230)/2, (ht-90)/2 ) )
                            wiErreurSelectRecherche.resizable(False,False)
                            wiErreurSelectRecherche.title(u'Erreur de sélection')
                            Label(wiErreurSelectRecherche, fg='red', text=os.linesep + u'Choisissez un élément.' + os.linesep).pack(side=TOP)
                            Button(wiErreurSelectRecherche, text="Ok", fg='dark slate blue', activebackground='white', activeforeground='#2a7aff', command = wiErreurSelectRecherche.destroy).pack(side=BOTTOM, pady=5)
                            wiErreurSelectRecherche.bind('<Escape>', wiErreurSelectRecherche.destroy )
     
                    def Quitter_ResultRecherche(event = None):
                        wiResultRecherche.destroy()
     
                    wiClassRechercher.withdraw()
                    IndRecherche = 0
                    RalentRecherche = 0
                    lanceur = 'Recherche'
                    PgBarre = BarreProgress(IndRecherche, lanceur)
                    imr1=PhotoImage(file = PathWasabi + "efface.ppm")
                    imr2=PhotoImage(file = PathWasabi + "exec.ppm")
                    imr3=PhotoImage(file = PathWasabi + "ouvrir.ppm")
                    imr4=PhotoImage(file = PathWasabi + "exit.ppm")
                    wiResultRecherche = Toplevel()
                    wiResultRecherche.withdraw()
                    wiResultRecherche.title(u'Résultats de la recherche')
                    wt = wiResultRecherche.winfo_screenwidth()
                    ht = wiResultRecherche.winfo_screenheight()
                    wiResultRecherche.geometry("%dx%d+%d+%d" % (350,410, (wt-350)/2, (ht-410)/2 ) )
                    wiResultRecherche.resizable(width=False, height=False)
                    FmResultRecherche = Frame(wiResultRecherche, width=360, height=350, relief=GROOVE)
                    xFmResultRecherche = Frame(FmResultRecherche, width=300, height=260, relief=GROOVE, borderwidth=1)
                    xFmResultRecherche.place(relx=0.01, rely=0.02, anchor=NW)
                    ListResultRecherche = Listbox(xFmResultRecherche, selectmode=EXTENDED, height=19, width=45, fg='dark slate blue', bg='white', selectforeground = 'dark slate blue')
                    ScrollResultRecherchey = Scrollbar(xFmResultRecherche, command=ListResultRecherche.yview)
                    ListResultRecherche.configure(yscrollcommand=ScrollResultRecherchey.set)
                    FmBoutResultRecherche = Frame(wiResultRecherche, relief=GROOVE, bg="white", borderwidth=3)
                    LabViderResultRecherche = Label(FmBoutResultRecherche, image=imr1, bg="white")
                    LabOuvrirRecherche = Label(FmBoutResultRecherche, image=imr2, bg="white")
                    LabSeDepRech = Label(FmBoutResultRecherche, image=imr3, bg="white")
                    LabQuitterResultRecherche = Label(FmBoutResultRecherche, image=imr4, bg="white")
                    LabViderResultRecherche.image=imr1
                    LabOuvrirRecherche.image=imr2
                    LabSeDepRech.image=imr3
                    LabQuitterResultRecherche.image=imr4
                    FmResultRecherche.pack(side=TOP, expand=NO, fill=NONE)
                    ListResultRecherche.pack(side=LEFT)
                    ScrollResultRecherchey.pack(side=RIGHT, fill=Y)
                    FmBoutResultRecherche.pack(side=TOP, expand=NO, fill=NONE)
                    LabViderResultRecherche.pack(side=LEFT, padx=10)
                    LabOuvrirRecherche.pack(side=LEFT, padx=10)
                    LabSeDepRech.pack(side=LEFT, padx=10)
                    LabQuitterResultRecherche.pack(side=LEFT, padx=10)
                    ListResultRecherche.delete(0, END)
                    InfoBulle(parent=LabViderResultRecherche, texte=u'Supprimer tous les résultats')
                    InfoBulle(parent=LabOuvrirRecherche, texte=u'Ouvrir le fichier ou le dossier')
                    InfoBulle(parent=LabSeDepRech, texte=u'Ouvrir le dossier cible')
                    InfoBulle(parent=LabQuitterResultRecherche, texte=u'Quitter')
                    LabViderResultRecherche.bind('<ButtonRelease-1>', Vider_ResultRecherche)
                    LabOuvrirRecherche.bind('<ButtonRelease-1>', ResultRecherche_Ouvrir)
                    LabSeDepRech.bind('<ButtonRelease-1>', ResultRecherche_Deplace)
                    LabQuitterResultRecherche.bind('<ButtonRelease-1>', Quitter_ResultRecherche)
                    wiResultRecherche.bind('<Escape>', Quitter_ResultRecherche )
                    LabQuitterResultRecherche.bind('<Return>', Quitter_ResultRecherche)
                    ListResultRecherche.bind('<Double-1>', ResultRecherche_Ouvrir)
                    if Checkcourrant_Checkbutton_StringVar.get() == "yes":
                        listresult = []
                        listtmp = os.listdir(os.getcwd())
                        for items in listtmp:
                            CheminItem = os.path.join(os.getcwd(), items)
                            if CheminItem == CheminItem.replace('/.','/'):
                                if Checktous_Checkbutton_StringVar.get() == "yes" and items[-1] != '~':
                                    listresult.append(CheminItem)
                                elif Checkfonly_Checkbutton_StringVar.get() == "yes" and items[-1] != '~' and os.path.isfile(CheminItem):
                                    listresult.append(CheminItem)
                                elif Checkdonly_Checkbutton_StringVar.get() == "yes" and os.path.isdir(CheminItem):
                                    listresult.append(CheminItem)
                    elif Checkrepsous_Checkbutton_StringVar.get() == "yes":
                        listresult = []
                        for root, dirs, files in os.walk(os.getcwd()):
                            RalentRecherche += 1
                            if RalentRecherche == 100:
                                IndRecherche += 1
                                if IndRecherche == 190: IndRecherche = 0
                                PgBarre.Maj_Recherche(IndRecherche)
                                RalentRecherche = 0
                            TriResult(root, dirs, files)
                    elif Checkperso_Checkbutton_StringVar.get() == "yes":
                        listresult = []
                        for root, dirs, files in os.walk(os.environ['HOME']):
                            RalentRecherche += 1
                            if RalentRecherche == 100:
                                IndRecherche += 1
                                if IndRecherche == 190: IndRecherche = 0
                                PgBarre.Maj_Recherche(IndRecherche)
                                RalentRecherche = 0
                            TriResult(root, dirs, files)
                    for items in listresult:
                        RalentRecherche += 1
                        if RalentRecherche == 100:
                            IndRecherche += 1
                            if IndRecherche == 190: IndRecherche = 0
                            PgBarre.Maj_Recherche(IndRecherche)
                            RalentRecherche = 0
                        if Checkcomplet_Checkbutton_StringVar.get() == "yes":
                            if Checkcase_Checkbutton_StringVar.get() == "yes" and str(os.path.basename(items)) == str(Entry_Recherche_StringVar.get()):
                                result.append(items)
                            elif Checkcase_Checkbutton_StringVar.get() == "no" and str(os.path.basename(items)).lower() == str(Entry_Recherche_StringVar.get()).lower():
                                result.append(items)
                        else:
                            if len(str(Entry_Recherche_StringVar.get())) < len(str(os.path.basename(items))) + 1:
                                Val_Ind = 0
                                while (Val_Ind < len(str(os.path.basename(items)))-len(str(Entry_Recherche_StringVar.get())) + 1):
                                    if Checkcase_Checkbutton_StringVar.get() == "yes":
                                        if str(os.path.basename(items))[Val_Ind:len(str(Entry_Recherche_StringVar.get()))+Val_Ind] == str(Entry_Recherche_StringVar.get()):
                                            result.append(items)
                                            break
                                    else:
                                        if str(os.path.basename(items))[Val_Ind:len(str(Entry_Recherche_StringVar.get()))+Val_Ind].lower() == str(Entry_Recherche_StringVar.get()).lower():
                                            result.append(items)
                                            break
                                    Val_Ind += 1 
                    for items in result:
                        RalentRecherche += 1
                        if RalentRecherche == 100:
                            IndRecherche += 1
                            if IndRecherche == 190: IndRecherche = 0
                            PgBarre.Maj_Recherche(IndRecherche)
                            RalentRecherche = 0
                        ListResultRecherche.insert(END, items)
                        if os.path.isfile(items):
                            ListResultRecherche.itemconfig(ListResultRecherche.size() - 1, fg='#2a7aff', selectforeground = '#2a7aff')
                    wiResultRecherche.deiconify()
                    wiClassRechercher.destroy()
                    PgBarre.BarreQuit()
                    ListResultRecherche.bind('<Button-4>', lambda event: event.widget.yview_scroll(-1, UNITS))
                    ListResultRecherche.bind('<Button-5>', lambda event: event.widget.yview_scroll(1, UNITS))
                else:
                    wiPasDeRecherche = Toplevel()
                    wt = wiPasDeRecherche.winfo_screenwidth()
                    ht = wiPasDeRecherche.winfo_screenheight()
                    wiPasDeRecherche.geometry("%dx%d+%d+%d" % (250, 90, (wt-250)/2, (ht-90)/2 ) )
                    wiPasDeRecherche.resizable(False,False)
                    wiPasDeRecherche.title(u'Erreur de saisie')
                    Label(wiPasDeRecherche, fg='red', text=os.linesep + u'Vous n\'avez pas saisie votre recherche.' + os.linesep).pack(side=TOP)
                    Button(wiPasDeRecherche, text="Ok", fg='dark slate blue', activebackground='white', activeforeground='#2a7aff', command = wiPasDeRecherche.destroy).pack(side=BOTTOM, pady=5)
                    wiPasDeRecherche.bind('<Escape>', wiPasDeRecherche.destroy )
     
            def Checkcase_Checkbutton_StringVar_Callback(varName, index, mode):
                pass
     
            def Checkcomplet_Checkbutton_StringVar_Callback(varName, index, mode):
                pass
     
            def Checkdonly_Checkbutton_StringVar_Callback(varName, index, mode):
                if Checkdonly_Checkbutton_StringVar.get() == "yes":
                    Checkfonly_Checkbutton_StringVar.set("no")
                    Checktous_Checkbutton_StringVar.set("no")
                Verif_Choix()
     
            def Checktous_Checkbutton_StringVar_Callback(varName, index, mode):
                if Checktous_Checkbutton_StringVar.get() == "yes":
                    Checkfonly_Checkbutton_StringVar.set("no")
                    Checkdonly_Checkbutton_StringVar.set("no")
                Verif_Choix()
     
            def Checkfonly_Checkbutton_StringVar_Callback(varName, index, mode):
                if Checkfonly_Checkbutton_StringVar.get() == "yes":
                    Checkdonly_Checkbutton_StringVar.set("no")
                    Checktous_Checkbutton_StringVar.set("no")
                Verif_Choix()
     
            def Checkperso_Checkbutton_StringVar_Callback(varName, index, mode):
                if Checkperso_Checkbutton_StringVar.get() == "yes":
                    Checkrepsous_Checkbutton_StringVar.set("no")
                    Checkcourrant_Checkbutton_StringVar.set("no")
                Verif_Choix()
     
            def Checkrepsous_Checkbutton_StringVar_Callback(varName, index, mode):
                if Checkrepsous_Checkbutton_StringVar.get() == "yes":
                    Checkperso_Checkbutton_StringVar.set("no")
                    Checkcourrant_Checkbutton_StringVar.set("no")
                Verif_Choix()
     
            def Checkcourrant_Checkbutton_StringVar_Callback(varName, index, mode):
                if Checkcourrant_Checkbutton_StringVar.get() == "yes":
                    Checkrepsous_Checkbutton_StringVar.set("no")
                    Checkperso_Checkbutton_StringVar.set("no")
                Verif_Choix()
     
            def Verif_Choix(event = None):
                if Checktous_Checkbutton_StringVar.get() == "no" and Checkfonly_Checkbutton_StringVar.get() == "no" and Checkdonly_Checkbutton_StringVar.get() == "no":
                    Checktous_Checkbutton_StringVar.set("yes")
                if Checkcourrant_Checkbutton_StringVar.get() == "no" and Checkrepsous_Checkbutton_StringVar.get() == "no" and Checkperso_Checkbutton_StringVar.get() == "no":
                    Checkperso_Checkbutton_StringVar.set("yes")
     
            Frame.__init__(self)
            wiClassRechercher = Toplevel()
            wt = wiClassRechercher.winfo_screenwidth()
            ht = wiClassRechercher.winfo_screenheight()
            wiClassRechercher.geometry("%dx%d+%d+%d" % (329,354, (wt-329)/2, (ht-354)/2 ) )
            wiClassRechercher.resizable(width=False, height=False)
            wiClassRechercher.x, wiClassRechercher.y, wiClassRechercher.w, wiClassRechercher.h = -1,-1,-1,-1
            wiClassRechercher.title("Recherche")
            Butannuler_Button = Button(wiClassRechercher,text="Annuler", relief="raised", width="15", fg='dark slate blue', activebackground='white', activeforeground='#2a7aff')
            Butannuler_Button.place(x=192, y=314, width=75, height=34)
            Butannuler_Button.bind("<ButtonRelease-1>", Butannuler_Button_Click)
            Butrechercher_Button = Button(wiClassRechercher,text="Rechercher", width="15", fg='dark slate blue', activebackground='white', activeforeground='#2a7aff')
            Butrechercher_Button.place(x=48, y=314, width=101, height=34)
            Butrechercher_Button.bind("<ButtonRelease-1>", Butrechercher_Button_Click)
            Labrecherche_Labelframe = LabelFrame(wiClassRechercher, text="Rechercher", height="298", relief="groove", width="306")
            Labrecherche_Labelframe.place(x=12, y=12)
            LabOption_Labelframe = LabelFrame(Labrecherche_Labelframe, text="Options", height="240", relief="groove", width="290")
            LabOption_Labelframe.place(x=5, y=34)
            Labtitre_Label = Label(Labrecherche_Labelframe, text = 'Rechercher : ', fg='dark slate blue')
            Labtitre_Label.place(x=5, y=5)
            Entry_Recherche = Entry(Labrecherche_Labelframe,foreground="#000000", width="15", relief="sunken", background="white", fg = 'blue', font="Helvetica -12")
            Entry_Recherche.place(x=90, y=5, width=203, height=23)
            Entry_Recherche_StringVar = StringVar()
            Entry_Recherche.configure(textvariable=Entry_Recherche_StringVar)
            Entry_Recherche_StringVar.set("")
            Checkcase_Checkbutton = Checkbutton(LabOption_Labelframe, text="Respecter la case", relief="flat", width="15", fg='dark slate blue', activeforeground='#2a7aff', selectcolor='dark slate blue')
            Checkcase_Checkbutton.place(x=5, y=10, width=127, height=24)
            Checkcase_Checkbutton_StringVar = StringVar()
            Checkcase_Checkbutton.configure(variable = Checkcase_Checkbutton_StringVar, onvalue="yes", offvalue="no")
            Checkcase_Checkbutton_StringVar_traceName = Checkcase_Checkbutton_StringVar.trace_variable("w",  Checkcase_Checkbutton_StringVar_Callback)
            Checkcomplet_Checkbutton = Checkbutton(LabOption_Labelframe, text="Nom complet uniquement", relief="flat", width="15", fg='dark slate blue', activeforeground='#2a7aff', selectcolor='dark slate blue')
            Checkcomplet_Checkbutton.place(x=5, y=34, width=170, height=24)
            Checkcomplet_Checkbutton_StringVar = StringVar()
            Checkcomplet_Checkbutton.configure(variable=Checkcomplet_Checkbutton_StringVar, onvalue="yes", offvalue="no")
            Checkcomplet_Checkbutton_StringVar_traceName = Checkcomplet_Checkbutton_StringVar.trace_variable("w",  Checkcomplet_Checkbutton_StringVar_Callback)
            Checkcourrant_Checkbutton = Checkbutton(LabOption_Labelframe, text=u'Repertoire courrant uniquement', relief="flat", width="15", fg='dark slate blue', activeforeground='#2a7aff', selectcolor='dark slate blue')
            Checkcourrant_Checkbutton.place(x=5, y=78, width=210, height=24)
            Checkcourrant_Checkbutton_StringVar = StringVar()
            Checkcourrant_Checkbutton.configure(variable=Checkcourrant_Checkbutton_StringVar, onvalue="yes", offvalue="no")
            Checkcourrant_Checkbutton_StringVar_traceName = Checkcourrant_Checkbutton_StringVar.trace_variable("w", Checkcourrant_Checkbutton_StringVar_Callback)
            Checkdonly_Checkbutton = Checkbutton(LabOption_Labelframe, text="Uniquement des dossiers", width="15", fg='dark slate blue', activeforeground='#2a7aff', selectcolor='dark slate blue')
            Checkdonly_Checkbutton.place(x=5, y=194, width=175, height=24)
            Checkdonly_Checkbutton_StringVar = StringVar()
            Checkdonly_Checkbutton.configure(variable=Checkdonly_Checkbutton_StringVar, onvalue="yes", offvalue="no")
            Checkdonly_Checkbutton_StringVar_traceName = Checkdonly_Checkbutton_StringVar.trace_variable("w",  Checkdonly_Checkbutton_StringVar_Callback)
            Checkfonly_Checkbutton = Checkbutton(LabOption_Labelframe, text="Uniquement des fichiers", justify="center", width="15", fg='dark slate blue', activeforeground='#2a7aff', selectcolor='dark slate blue')
            Checkfonly_Checkbutton.place(x=5, y=170, width=170, height=24)
            Checkfonly_Checkbutton_StringVar = StringVar()
            Checkfonly_Checkbutton.configure(variable=Checkfonly_Checkbutton_StringVar, onvalue="yes", offvalue="no")
            Checkfonly_Checkbutton_StringVar_traceName = Checkfonly_Checkbutton_StringVar.trace_variable("w",  Checkfonly_Checkbutton_StringVar_Callback)
            Checkperso_Checkbutton = Checkbutton(LabOption_Labelframe, text="Rechercher dans tous les dossiers", relief="flat", width="15", fg='dark slate blue', activeforeground='#2a7aff', selectcolor='dark slate blue')
            Checkperso_Checkbutton.place(x=5, y=126, width=230, height=24)
            Checkperso_Checkbutton_StringVar = StringVar()
            Checkperso_Checkbutton.configure(variable=Checkperso_Checkbutton_StringVar, onvalue="yes", offvalue="no")
            Checkperso_Checkbutton_StringVar_traceName = Checkperso_Checkbutton_StringVar.trace_variable("w",  Checkperso_Checkbutton_StringVar_Callback)
            Checkrepsous_Checkbutton = Checkbutton(LabOption_Labelframe, text=u'Rechercher aussi dans les sous repertoires', relief="flat", width="15", fg='dark slate blue', activeforeground='#2a7aff', selectcolor='dark slate blue')
            Checkrepsous_Checkbutton.place(x=5, y=102, width=280, height=24)
            Checkrepsous_Checkbutton_StringVar = StringVar()
            Checkrepsous_Checkbutton.configure(variable=Checkrepsous_Checkbutton_StringVar, onvalue="yes", offvalue="no")
            Checkrepsous_Checkbutton_StringVar_traceName = Checkrepsous_Checkbutton_StringVar.trace_variable("w",  Checkrepsous_Checkbutton_StringVar_Callback)
            Checktous_Checkbutton = Checkbutton(LabOption_Labelframe, text="Les deux", relief="flat", width="15", fg='dark slate blue', activeforeground='#2a7aff', selectcolor='dark slate blue')
            Checktous_Checkbutton.place(x=190, y=170, width=80, height=24)
            Checktous_Checkbutton_StringVar = StringVar()
            Checktous_Checkbutton.configure(variable=Checktous_Checkbutton_StringVar, onvalue="yes", offvalue="no")
            Checktous_Checkbutton_StringVar_traceName = Checktous_Checkbutton_StringVar.trace_variable("w",  Checktous_Checkbutton_StringVar_Callback)
            Checktous_Checkbutton_StringVar.set("yes")
            Checkperso_Checkbutton_StringVar.set("yes")
            InfoBulle(parent=Entry_Recherche, texte=u'Donnez le nom ou une partie du nom du' + os.linesep + u'dossier ou fichier que vous recherchez')
            InfoBulle(parent=LabOption_Labelframe, texte=u'Sélectionnez vos options pour' + os.linesep + u'affiner votre recherche')
            wiClassRechercher.bind('<Escape>', Butannuler_Button_Click )
    Pour PgBarre regarde PgBarre = BarreProgress(IndRecherche, lanceur) dans la première page.

    Pour InfoBulle c'est presque celle de la faq.

    Sinon pour ce qui est de tout cela je vais tester.
    Merci d'utiliser le forum pour les questions techniques.

  15. #15
    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 eyquem Voir le message
    Je ne comprends pas une autre chose:
    à quoi correspond items[-1] égal ou non à ~??
    Pardon, pas vu...
    Sous tux les fichiers qui finissent par ~ sont des temporaires des applications comme open office (surtout) par exemple. A ne pas afficher donc.
    Il reste pas mal d'extensions comme le .bak de nedit etc... Je ne vais pas tout tester... Surtout que .bak, .sos et autres .tucmuch c'est utilisable par un utilisateur.
    Merci d'utiliser le forum pour les questions techniques.

  16. #16
    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
    Dans un premier temps merci à tous pour vos réponses.

    Je teste cela (niveau time/résultats) et je posterais les résultats dés que possible (c'est lundi, allez hop au taf...).
    Par contre j'ai du mal avec ta fonction Une fonction récursive N.tox
    Merci d'utiliser le forum pour les questions techniques.

  17. #17
    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
    Je pense que je m'y prend mal avec ton idée Antoine_935

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    def allFilesButHiden2(rootPath):
        RepAParcourir = []
        ListeARetourner = []
        RepAParcourir.append(rootPath)
        while RepAParcourir:
            for Rep in RepAParcourir:
                for elem in os.listdir(Rep):
                    if elem[0]!='.' and elem[-1:] != '~':
                        if os.path.isdir(Rep + '/' + elem):
                            RepAParcourir.append(Rep + '/' + elem)
                        else: ListeARetourner.append(Rep + '/' + elem)
                RepAParcourir.remove(Rep)
        return ListeARetourner
    C'est sans doute au niveau du RepAParcourir.remove(Rep) car j'ai moins de résultats qu'un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    def allFilesButHiden1(rootPath):
        ListeARetourner = []
        for root, dirs, files in os.walk(rootPath):
            for items in files:
                CheminFiles = os.path.join(root, items)
                if CheminFiles == CheminFiles.replace('/.','/') and items[-1:] != '~':
                    ListeARetourner.append(CheminFiles)
            for items in dirs:
                CheminDir = os.path.join(root, items)
                if CheminDir == CheminDir.replace('/.','/'):
                    ListeARetourner.append(CheminDir)
        return ListeARetourner
    Et c'est toujours les répertoires en bout de recherche...
    Merci d'utiliser le forum pour les questions techniques.

  18. #18
    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
    Par contre...

    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
    import os.path
    import time
     
    def allFilesButHiden1(rootPath):
        ListeARetourner = []
        for root, dirs, files in os.walk(rootPath):
            for items in files:
                CheminFiles = os.path.join(root, items)
                if CheminFiles == CheminFiles.replace('/.','/') and items[-1:] != '~':
                    ListeARetourner.append(CheminFiles)
            for items in dirs:
                CheminDir = os.path.join(root, items)
                if CheminDir == CheminDir.replace('/.','/'):
                    ListeARetourner.append(CheminDir)
        return ListeARetourner
     
    def allFilesButHiden2(rootPath):
        RepAParcourir = []
        ListeARetourner = []
        RepAParcourir.append(rootPath)
        while RepAParcourir:
            for Rep in RepAParcourir:
                for elem in os.listdir(Rep):
                    if elem[0]!='.' and elem[-1:] != '~':
                        if os.path.isdir(Rep + '/' + elem):
                            RepAParcourir.append(Rep + '/' + elem)
                        else: ListeARetourner.append(Rep + '/' + elem)
                RepAParcourir.remove(Rep)
        return ListeARetourner
     
    tps1 = time.clock()
    Resultat1 = allFilesButHiden1(os.environ['HOME'] + '/Bureau')
    tps2 = time.clock()
    print 'Duree de Resultat1 :'
    print(tps2 - tps1)
    print 'Resultat d\un os.walk'
    print len(Resultat1)
     
    tps1 = time.clock()
    Resultat2 = allFilesButHiden2(os.environ['HOME'] + '/Bureau')
    tps2 = time.clock()
    print 'Duree de Resultat2 :'
    print(tps2 - tps1)
    print 'Resultat d\un os.lisdir avec amorce sur le root'
    print len(Resultat2)
     
    # for items in Resultat2:
      #   Resultat1.remove(items)
     
    # print 'dif'
    # print Resultat1
    # print len(Resultat1)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Duree de Resultat1 :
    1.0
    Resultat d\un os.walk
    28703
    Duree de Resultat2 :
    0.57
    Resultat d\un os.lisdir avec amorce sur le root
    27793
    ... C'est bien plus rapide !
    Si j'arrive a récupérer les derniers rep c'est tout bon.

    Il me reste a comprendre le récursif de N.tox pour comparer tout cela.
    Merci d'utiliser le forum pour les questions techniques.

  19. #19
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    def allFilesButHiden2(rootPath):
        RepAParcourir = []
        ListeARetourner = []
        RepAParcourir.append(rootPath)
        while RepAParcourir:
            for Rep in RepAParcourir:
                for elem in os.listdir(Rep):
                    if elem[0]!='.' and elem[-1:] != '~':
                        ListeARetourner.append(Rep + '/' + elem)
                        if os.path.isdir(Rep + '/' + elem):
                            RepAParcourir.append(Rep + '/' + elem)
                RepAParcourir.remove(Rep)
        return ListeARetourner
    C'est ma 'blonde attitude'...

    Par contre la solution de N.tox a l'air plus rapide mais il me manque des éléments...
    Si tu pouvais me dire ou je me plante N.tox

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    def allFilesButHiden3(rootPath):
        for elem in os.listdir(rootPath):
            if elem[0]!='.' and elem[-1:] != '~':
                if os.path.isdir(rootPath+elem):
                    for e in allFilesButHiden3(rootPath+elem+'/'):
                        yield rootPath+elem+e
                else:
                    yield '/'+elem
    (Avec / à la fin de rootPath bien sur)
    Merci d'utiliser le forum pour les questions techniques.

  20. #20
    Membre éprouvé
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Points : 1 066
    Points
    1 066
    Par défaut
    Il y a moyen de faire plus rapide encore en supprimant 2-3 bricoles (ptet pas par rapport à la version de N.Tox, je répondais au message d'avant):
    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
    def allFilesButHidden(basedir):
        explore = [basedir]
        result = []
     
        # Les accès locaux sont bcp plus rapides que les autres
        listdir = os.listdir
        addExplore = explore.append
        addResult = result.append
        getItem = explore.pop
        isfile = os.path.isfile
        isdir = os.path.isdir
        # On ne gère pas les liens ici, mais tu pourrais
     
        while explore:
            for item in listdir(getItem(0)):
                if item[0] != '.':
                    fullpath = joinpath(thisDir, item)
     
                    if isfile(fullpath):
                        addResult(fullpath)
                    elif isdir(fullpath):
                        addExplore(fullpath)
     
                    # On aurait pu faire une jolie ternaire, mais gaffe aux liens
                    # qui peuvent faire des boucles infinies
                    # isfile(fullpath) and addResult(fullpath) or addExplore(fullpath)
     
        return result
    Ce code n'est pas testé, mais devrait plus ou moins fonctionner.
    Tu pourrais peut-être gagne encore un rien de performances en utilisant functools.partial pour remplacer le getItem, à voir...

    La solution de N.Tox sera plus rapide en cas de boucle, puisqu'il s'agit d'un générateur, et que donc il ne doit pas créer tout une liste.
    On peut facilement transformer la fonction ci-dessus en un générateur:
    il suffit de remplacer le addResult par yield
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if isfile(fullpath):
        yield fullpath
    Sa solution a un avantage par contre: elle va d'abord aller au plus profond des dossiers. La mienne va d'abord au plus large.
    Cela dit on pourrait surement s'arranger pour que celle ci fasse au plus profond en premier...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    elif isdir(fullpath):
        explore.insert(0, fullpath)
    Edit: dans ce dernier cas, une stack serait plus appropriée qu'une liste.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. optimisation sur des listes
    Par cesium dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 13/07/2010, 19h13
  2. Utiliser des connexions multiples sur des listes
    Par MasterJul dans le forum SharePoint
    Réponses: 0
    Dernier message: 08/02/2008, 12h41
  3. Réponses: 5
    Dernier message: 27/02/2007, 11h43
  4. Problème de rafraîchissement de post sur des listes
    Par Greggggggg dans le forum Langage
    Réponses: 7
    Dernier message: 21/08/2006, 14h32
  5. [Javascript] Question pas difficile sur des listes dynamique...
    Par mulbek dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 12/04/2006, 09h55

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