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 :

Moteur de recherche de fichier [Glade - Ubuntu]


Sujet :

Python

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 16
    Points : 8
    Points
    8
    Par défaut Moteur de recherche de fichier [Glade - Ubuntu]
    Bonjour,
    Je recherche comment faire pour creer un moteur de recherche d fichiers sur mon pc.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    def gtk_on_sc_fichier_valider_clicked(self, source=None, event=None):
            file = self.widgets.get_widget('sc_fichier_entree').get_text()   
            extension = file.split("." )[-1]
            nom = file.split(".")[0]
            for nom, extension in os.listdir('.'):
                if fnmatch.fnmatch(nom, extention):
                    print  'Trouver : \n %s' % str(file)
    Je voudrais que quand un utilisateur tape un nom de fichier "teste.py, ou teste" les scanner recherche dans le pc les fichier en question.
    Merci de votre aide

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

    Informations professionnelles :
    Activité : Retraité

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

    Voilà un programme tout simple qui devrait faire ce que tu recherches.

    On rentre un répertoire de départ, et un motif (comme "*.pdf"), et la fonction renvoie la liste des fichiers qui correspondent au motif avec leur chemin complet. La fonction fait un parcours récursif de l'arborescence.

    C'est assez rapide. Le parcours dans une arborescence complexe d'environ 100 Go fait un peu plus de 2 mn.

    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
     
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
     
    import os, glob
     
    ##############################################################################
    def cherchefichier(rep, nf):
        L = glob.glob(os.path.join(rep,nf))
        for r in os.listdir(rep):
            if os.path.isdir(os.path.join(rep,r)):
                L.extend(cherchefichier(os.path.join(rep,r), nf))
        return L
     
    ##############################################################################
     
    nf = ur"*.pdf"
    rep = ur"C:\repertoire de recherche"
     
    L = cherchefichier(rep, nf)
    for x in L:
        r, f = os.path.split(x)
        print f, "[" + r + "]"
    On pourrait imaginer des développements:

    - introduire une liste de sélections ("*.py;*.pdf"), et même une liste d'exclusions ("*.bak;Thumbs.db"). Dans ce cas, il faut utiliser le module fnmatch en remplacement de glob.

    - lister avec tri selon les noms de fichier ou selon les noms de répertoires.

    - lister avec les propriétés de chaque fichier: taille, date de modif, propriétaire, droits, ... selon l'OS (Windows, Linux, ...).

    Tyrtamos
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 16
    Points : 8
    Points
    8
    Par défaut
    J'ai modifier mon code et sa donne sa :
    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
     
    #!/usr/bin/python
    # -*- coding: iso-8859-1 -*-
    import pygtk
    pygtk.require("2.0")
    import gtk
    import gtk.glade
    import os,  glob
    import fnmatch
     
    class scanner:
        def __init__(self):
            self.widgets = gtk.glade.XML('scanner.glade',"window1")
            self.autoConnect()
     
        def autoConnect(self):
            eventHandlers = {}
            for (itemName,value) in self.__class__.__dict__.items(): 
                if callable(value) and itemName.startswith('gtk_'):  
                    eventHandlers[itemName[4:]] = getattr(self,itemName)
                    self.widgets.signal_autoconnect(eventHandlers)
     
        def gtk_on_sc_fichier_valider_clicked(self, source=None, event=None):
            file = self.widgets.get_widget('sc_fichier_entree').get_text()   
            extension = file.split("." )[-1]
            nom = file.split(".")[0]
            dossier = os.walk('.')
            if file =='':
                print 'Vide'
            if os.path.exists(file) == True:
                if os.path.isfile(file) == True:
                    print  'Trouver : %s' % file.count(nom),'fichier(s)'
                    print '%s' %str(file),  'est un fichier de :',  os.path.getsize(file), 'Bytes'
                if os.path.isdir(file) == True:
                    print  'Trouver : %s' % str(file)
                    print '%s' %str(file),  'est un dossier'
            for root, dirs, files in dossier:
                    for nom in files :
                        if fnmatch.fnmatch(nom, extension) :
                            print 'Trouver :',  nom
            if os.path.exists(file) == False :
                print 'Rien trouver pour : %s' %str(file)
     
    if __name__ == '__main__':
        app = scanner()
        gtk.main()
    J'ai tester ton code et il ne fonctionne pas sous Linux. je ne sais pas pourquoi, il mets des erreur au niveau de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for r in os.listdir(rep)

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

    Informations professionnelles :
    Activité : Retraité

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

    J'ai essayé sous linux (opensuse 11.1).

    Ça marche, mais il faudrait tester le droit de rentrer dans chaque répertoire avant avec os.access(chemin, mode), sinon, erreur avec os.listdir(). Ou récupérer l'erreur avec un try..except. Réessaie sous root (sudo sous ubuntu) pour vérifier.

    Par exemple, le code suivant donne un message quand la fonction ne peut pas rentrer dans un répertoire. Au lieu du message avec print, il est possible de renvoyer une liste d'erreur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    def cherchefichier(rep, nf):
        if not os.access(rep, os.X_OK ):
            print u"Impossible de rentrer dans ", rep
            return []
        L = glob.glob(os.path.join(rep,nf))
        for r in os.listdir(rep):
            nfc = os.path.join(rep,r)
            if os.path.isdir(nfc):
                L.extend(cherchefichier(nfc, nf))
        return L
    Par ailleurs, il faudrait éviter les bouclages possibles avec les liens symboliques (test avec os.path.islink()) ou même les liens en dur (qui ne sont pas des fichiers mais des accès supplémentaires aux mêmes fichiers).

    Mais pour chercher des fichiers dans une arborescence de données "ordinaires" sur laquelle on les droits, pas de problème.

    Tyrtamos
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 16
    Points : 8
    Points
    8
    Par défaut
    j'ai reussi a faire ce que je voulais :

    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
    #!/usr/bin/python
    # -*- coding: iso-8859-1 -*-
    import pygtk
    pygtk.require("2.0")
    import gtk
    import gtk.glade
    import os,  glob
    import fnmatch
     
    class scanner:
        def __init__(self):
            self.widgets = gtk.glade.XML('scanner.glade',"window1")
            self.autoConnect()
     
        def autoConnect(self):
            eventHandlers = {}
            for (itemName,value) in self.__class__.__dict__.items(): 
                if callable(value) and itemName.startswith('gtk_'):  
                    eventHandlers[itemName[4:]] = getattr(self,itemName)
                    self.widgets.signal_autoconnect(eventHandlers)
     
        def gtk_on_sc_fichier_valider_clicked(self, source=None, event=None):
            file = self.widgets.get_widget('sc_fichier_entree').get_text()   
            extension = file.split("." )[-1]
            nom = file.split(".")[0]
            dossier = os.walk('.')
     
            if file == '':
                print 'Veuiller indiquer le nom d\'un fichier à chercher.'
     
            if file !='':
    #############################################################################
    #Recherche et affiches les dossiers ou le "fichier" est present.                                                                                                 #
    #############################################################################
                if os.path.isfile(file) :
                    #print'%s' %str(file), 'est un fichier'
                    for reps, sous_reps, fichiers in dossier :
                        for fichier in fichiers :
                            if fichier.endswith('.%s'%extension) :
                                print  'Trouver :  %s'% fichiers.count(file),'fichier(s) ["%s"]'%str(file),', dans : "%s"'%os.path.join(reps)
                            else :
                                print 'Aucune correspondance, pour "%s".'%str(file)
    #############################################################################
     
    #############################################################################
    #Recherche et affiches les dossiers ou le "dossier" est present.                                                                                                 #
    #############################################################################
                if os.path.isdir(file) :
                    #print'%s' %str(file), 'est un dossier'
                    for reps, sous_reps, fichiers in dossier :
                        for dossiers in reps :
                            if dossiers == reps :
                                print 'Trouver : %s'% reps.count(dossiers),'dossier(s) ["%s"]'%str(file),', dans : "%s"'%os.path.join(reps)
                            else :
                                print 'Aucune correspondance, pour "%s".'%str(file)
    #############################################################################
     
    #############################################################################
    #Recherche et affiches les dossiers ou l' "extension" est presente.                                                                                                 #
    #############################################################################
                if file.endswith('.%s'%extension) == True :
                    #print'%s' %str(file), 'est une extension'
                    for reps, sous_reps, fichiers in dossier :
                        for fichier in fichiers :
                            if fichier.endswith('.%s'%extension) :
                                print  'Trouver :  %s'% fichier.count(file),'fichier(s) ["%s"]'%str(file),', dans : "%s"'%os.path.join(reps)
                                print 'Ce fichier est : %s'%fichier
                            else :
                                print 'Aucune correspondance, pour "%s".'%str(file)
    #############################################################################
     
    #############################################################################
    #Recherche et affiches les dossiers ou le "nom" est presente.                                                                                                 #
    #############################################################################
                if file.startswith('%s'%nom) == True :
                    #print'%s' %str(file), 'est un nom de fichier ou dossier'
                    for reps, sous_reps, fichiers in dossier :
                        for fichier in fichiers :
                            if fichier.startswith('%s'%nom) :
                                print  'Trouver :  %s'% fichier.count(file),'fichier(s) ["%s"]'%str(file),', dans : "%s"'%os.path.join(reps)
                                print 'Ce fichier est : %s'%fichier
                            else :
                                print 'Aucune correspondance, pour "%s".'%str(file)
    #############################################################################
     
    if __name__ == '__main__':
        app = scanner()
        gtk.main()

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

Discussions similaires

  1. Moteur de recherche fichier
    Par mowegan dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 11/05/2009, 16h27
  2. Moteur de recherche sur grosse base de fichiers txt
    Par matperino dans le forum Langage
    Réponses: 7
    Dernier message: 03/05/2008, 21h15
  3. un moteur de recherche ubuntu, en francais
    Par traaf dans le forum Ubuntu
    Réponses: 0
    Dernier message: 23/10/2007, 18h22
  4. [JSP/SERVLET] Moteur de recherche dans fichiers PDF
    Par crewstyle dans le forum Servlets/JSP
    Réponses: 8
    Dernier message: 27/04/2007, 16h18
  5. Réponses: 4
    Dernier message: 12/05/2006, 13h09

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