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

Contribuez Python Discussion :

[code]Recherche d'une chaine dans des fichiers


Sujet :

Contribuez Python

  1. #1
    Membre à l'essai
    Inscrit en
    Janvier 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Janvier 2007
    Messages : 21
    Points : 13
    Points
    13
    Par défaut [code]Recherche d'une chaine dans des fichiers
    Ce script est destiné à la recherche de fichiers qui contiennent une chaîne de caractère dans un ensemble de fichiers contenus dans un répertoire parent ou dans des sous répertoires du répertoire parent.

    L'utilité de ce script est de retrouver les fichiers à modifier lorsqu'on connait la chaîne recherchée, mais pas les fichiers concernés. Cette méthode est beaucoup moins 'sure' et beaucoup moins 'professionnelle' qu'un débugage, mais elle est aussi beaucoup plus rapide (surtout si vous ne maîtrisez pas le language ou si les programmes ne sont pas commentés).

    Le script va analyser l'intégralité des fichiers présents dans le répertoire parent et tous les sous répertoires. Dans chaque fichier, une recherche de la chaîne est effectuée. Si la chaîne est détectée, on sauvegarde le chemin d'accés et le nom du fichier en question.

    Attention, il est possible que certains fichiers ne soit pas traités correctement. Deux raisons à celà :

    * La première (qui vous sera annoncé sur la console) est liée aux droits d'accés des fichiers. Il est évident que les restrictions habituelles de lecture restent opérationnelles.
    * La deuxième (qui est tranparente pour l'utilisateur) est liée à la manière dont est écrite le fichier. En effet, la fonction utilisée pour l'analyse du fichier (read) peut détecter la fin du fichier avant l'heure... Ceci étant, pour l'application décrite au dessus (recherche de chaîne dans des fichiers de type texte/programme) ce type d'erreur est peu probable.

    Pour rentrer un peu plus dans le vif du sujet, ce script utilise la classe os.path qui permet entre autre de gérer l'arboréscance des répertoires et les fichier. Vous remarquerez que j'ai fais un effort considérable sur les commentaires afin que ce programme soit d'une part adaptable facilement, et que d'autre part, il puisse servir d'exemple/tutorial. Vous noterez également que j'ai pris en compte la portabilité de l'application (windows/linux) grâce à la variable 'port'.

    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
    import os.path
     
    def searchCode(pathIn='',chaine='',port='\\'):
    	"""Recherche dans le repertoire et les sous repertoires 'path' la chaine de caractere 'chaine'
            et retourne une liste des chemins vers les fichiers ou la chaine a ete trouvee.
            La variable 'port' permet de porter ce script de linux a windows en un clin d'oueil ;-)"""
    	fileOut=[]#Initialisation d'une liste representant les chemins vers fichiers ou la chaine a ete trouvee
    	error=0
    	for root, dirs, fileIn in os.walk(pathIn):
    		#Lecture des differents fichiers du repertoire root
    		for i in range(0,len(fileIn)):
    			try:
    				#'Lecture du fichier' fileIn[i],'situe dans le repertoire',root
    				fichier=open(root+port+fileIn[i],'r')#Ouverture du fichier
    				data=fichier.read()#Lecture des donnees sauvegardees sous forme de liste
    				if data.count(chaine):#Teste si la chaine est contenue dans le fichier
    					#'La chaine a ete trouvee',data.count(chaine),'fois.'
    					fileOut=fileOut+[root+port+fileIn[i]]#sauvegarde du chemin dans une liste
    					fichier.close()#Fermeture du fichier
    			except:
    				print 'Erreur lors du traitement du fichier', str(root+port+fileIn[i])
    				error=error+1
    	print 'Traitement termine, '+str(len(fileOut))+' fichier(s) contenant la chaine. '+str(error)+' erreur(s)'
    	return fileOut
     
    #Programme principal de test de la fonction
    print 'Bonjour, et bienvenu,\nPour tout renseignement, contacter tonny.rosca@gmail.com'
    sortie=searchCode(pathIn='D:\\xampplite\\htdocs\\lewebvuparguigui',chaine='Lire la suite')
    for i in range(0,len(sortie)):
    	print 'Le fichier '+str(sortie[i])+' contient la chaine recherchee.'
    Pour avoir la dernière version, ou tout simplement motiver ma participation, visitez mon site (je mettrai bientôt en ligne une seconde version de ce script écrit sous forme de classe avec une interface graphique Tkinter) : "Le web vu par Guigui"

  2. #2
    Membre à l'essai
    Inscrit en
    Janvier 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Janvier 2007
    Messages : 21
    Points : 13
    Points
    13
    Par défaut Version 2 du code
    Bonjour à tous,

    Je suis un peu dessus de ne voir aucun commentaire sur les deux codes que j'ai proposé. Malgré tout, je vais poster la mise à jour que j'ai promis.
    Si ce type d'applications python ne sont pas assez pertinantes, faite le moi savoir de sorte que je ne surcharge pas le forum
    Voici donc le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    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
    import os.path
    from Tkinter import *
    import tkFileDialog
     
    class SearchChar:
    	def __init__(self, parent):
    		"""Initialisation de l'IGU"""
    		self.parent=parent
    		self.parent.title('Recherche de chaine dans des fichiers')
    		self.initialDir="D:\\Sauvegardes\\Python\\test"
    		self.port='\\'
    		self.fileOut=[]
    		self.menuBar()
    		self.container1=Frame(self.parent)
    		self.container1.pack(fill=X)
    		self.label1=Label(self.container1,text='Entrez la chaine recherchee')
    		self.label1.pack(side='left',fill=X)
    		self.entry1=Entry(self.container1)
    		self.entry1.pack(side='left',expand=YES,fill=X)
    		self.button2=Button(self.container1,text= "Effectuer la recherche",command=self.searchCode)
    		self.button2.pack(side='left',fill=X)
    		self.container3=Frame(self.parent)
    		self.container3.pack(fill=BOTH)
    		self.interface=Text(self.container3)
    		self.interface.insert('end','Bonjour et bienvenu\nPour tout renseignement tonny.rosca@gmail.com\n...')
    		self.interface.pack(side='left',expand=YES,fill=BOTH)
    		self.yscrollbar=Scrollbar(self.container3)
    		self.yscrollbar.pack(side='right',fill=Y)
    		self.container4=Frame(self.parent)
    		self.container4.pack(fill=X)
    		self.buttonExit=Button(self.container4,text="Quitter",command="exit")
    		self.buttonExit.pack(fill=X)
     
    	def menuBar(self):
    		"""Initialisation de la barre de menu"""
    		self.menu=Menu()
    		self.fichier=Menu()
    		self.fichier.add_command(label='Enregistrer sous',command=self.saveWork)
    		self.fichier.add_command(label='Quitter',command="exit")
    		self.menu.add_cascade(label='Fichier',menu=self.fichier)
    		self.executer=Menu()
    		self.executer.add_command(label='Choisir un repertoire de recherche',command=self.parentPath)
    		self.executer.add_command(label='Effectuer la recherche',command=self.searchCode)
    		self.executer.add_command(label='Afficher le rapport',command=self.printResult)
    		self.menu.add_cascade(label='Outils',menu=self.executer)
    		self.aide=Menu()
    		self.aide.add_command(label='A propos...',command=self.aboutVersion)
    		self.aide.add_command(label='Aide',command=self.aboutAuthor)
    		self.menu.add_cascade(label='?',menu=self.aide)
    		self.parent.config(menu=self.menu)
     
    	def saveWork(self):
    		"""Sauvegarde des resultats"""
    		try:
    			self.pathOut=tkFileDialog.asksaveasfilename()
    			self.interface.insert('end','Ecriture des donnes dans le fichier '+str(self.pathOut)+'\n...')
    			self.outputFile=open(self.pathOut,'w')
    			self.outputFile.write('La chaine '+str(self.chaine)+' a ete trouvee dans le(s) fichier(s) suivant(s) :\n')
    			for i in range(0,len(self.fileOut)):
    				self.outputFile.write(str(self.fileOut[i])+'\n')
    			self.outputFile.close
    			self.interface.insert('end','Traitement effectue avec succes\n...')
    		except:
    			self.interface.insert('end','Erreur lors de la sauvegarde du fichier\n...')
    		self.yscrollbar.config(command=self.interface.yview)
     
    	def aboutAuthor(self):
    		"""Joindre l'auteur"""
    		self.interface.insert('end','Pour tout renseignement tonny.rosca@gmail.com\n...')
    		self.yscrollbar.config(command=self.interface.yview)
     
    	def aboutVersion(self):
    		"""Version"""
    		self.interface.insert('end','Recherche de chaine V2.0\n...')
    		self.yscrollbar.config(command=self.interface.yview)
     
    	def parentPath(self):
    		"""Choix du repertoire parent via une boite de dialogue"""
    		self.pathIn=tkFileDialog.askdirectory(parent=self.parent,initialdir=self.initialDir,title='Choisissez un repertoire de recherche')
    		self.interface.insert('end','Repertoire de recherche : '+str(self.pathIn)+'\n...')
    		self.yscrollbar.config(command=self.interface.yview)
     
    	def searchCode(self):
    		"""Recherche dans le repertoire et les sous repertoires 'path' la chaine de caractere 'chaine'
                    et retourne une liste des chemins vers les fichiers ou la chaine a ete trouvee.
                    La variable 'port' permet de porter ce script de linux a windows en un clin d'oueil ;-)"""
    		self.fileOut=[]#Initialisation d'une liste representant les chemins vers fichiers ou la chaine a ete trouvee
    		self.chaine=self.entry1.get()
    		error=0
    		for root, dirs, fileIn in os.walk(self.pathIn):
    			#Lecture des differents fichiers du repertoire root
    			for i in range(0,len(fileIn)):
    				try:
    					#'Lecture du fichier' fileIn[i],'situe dans le repertoire',root
    					fichier=open(root+self.port+fileIn[i],'r')#Ouverture du fichier
    					self.data=fichier.read()#Lecture des donnees sauvegardees sous forme de liste
    					if self.data.count(self.chaine):#Teste si la chaine est contenue dans le fichier
    						#'La chaine a ete trouvee',data.count(chaine),'fois.'
    						self.fileOut=self.fileOut+[root+self.port+fileIn[i]]
    						self.interface.insert('end','La chaine a ete trouvee '+str(self.data.count(self.chaine))+' fois dans le fichier '+root+self.port+fileIn[i]+'.\n...')
    					fichier.close()#Fermeture du fichier
    				except:
    					self.interface.inset('end','Le fichier '+root+self.port+fileIn[i]+' n a pas ete traite correctement.\n...')
    					error=error+1
    		self.interface.insert('end','Traitement termine, '+str(len(self.fileOut))+' fichier(s) detecte(s) contenant la chaine '+str(error)+' erreur(s) detectee(s).\n...')
    		self.yscrollbar.config(command=self.interface.yview)
     
    	def printResult(self):
    		"""Affiche la liste des fichiers trouves contenant la chaine dans l'interface utilisateur"""
    		if self.fileOut:
    			for i in range(0,len(self.fileOut)):
    				self.interface.insert('end',self.fileOut[i]+'\n...')
    		else:
    			self.interface.insert('end','Aucun fichier en memoire\n...')
    		self.yscrollbar.config(command=self.interface.yview)
     
    root=Tk()
    myapp=SearchChar(root)
    root.mainloop()
    Remarque : Lorsqu'on passe la fenêtre en plein écran, La zone de texte s'élargie selon l'axe horizontal, mais pas selon l'axe vertical. Si quelqu'un sait pourquoi, ce serait très aimable de me le faire savoir

  3. #3
    Invité
    Invité(e)
    Par défaut
    Hello,

    Concernant ton 1° source (je ne connais pas tkinter donc je peux pas commenter cette partie, désolé), tu effectues par défaut la recherche dans un répertoire indiqué en dur. Ne serait-il pas possible d'effectuer par défaut cette recherche dans un répertoire existant pour l'utilisateur, par exemple la racine de son DD ou de ses documents/de son home...?! Ou tout au moins traiter l'exception qui découle de ce répertoire inexistant

  4. #4
    Membre à l'essai
    Inscrit en
    Janvier 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Janvier 2007
    Messages : 21
    Points : 13
    Points
    13
    Par défaut
    Citation Envoyé par PierreAd
    Hello,

    Concernant ton 1° source (je ne connais pas tkinter donc je peux pas commenter cette partie, désolé), tu effectues par défaut la recherche dans un répertoire indiqué en dur. Ne serait-il pas possible d'effectuer par défaut cette recherche dans un répertoire existant pour l'utilisateur, par exemple la racine de son DD ou de ses documents/de son home...?! Ou tout au moins traiter l'exception qui découle de ce répertoire inexistant
    Salut,

    Pour informations, vous avez plusieurs possibilités pour imposer le répertoire parent. Soit directement "en dur" dans le fichier texte (ligne 31), ce qui vous permet de lancer le programme directement via la console (ou l'invité de commande).
    Vous pouvez également supprimer les lignes 29 à 33, et utiliser la fonction comme précisé ci dessous via la console python.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    from pySearch import searchCode
    searchCode('Votre chemin','Votre chaine')
    Enfin, un compromis entre les deux sollution serait de remplacer la ligne 31 par le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    pathIn=str(raw_input('Entrez le chemin d acces...\n'))
    chaine=str(raw_input('Entrez la chaine recherchee...\n'))
    sortie=searchChar(pathIn,chaine)
    En espérant que ceci réponde à votre question

    Remarque : Dans ce cas, il serait souhaitable de vérifier l'existance du répertoire dans la fonction searchChar

  5. #5
    Invité
    Invité(e)
    Par défaut
    ça ne répondait pas vraiment à ma remarque en fait
    En fait, je voulais dire que dans ton code tu fixes le répertoire de recherche. Ne serait-il pas plus "logique" de faire quelque chose comme cela :

    - si un chemin est fourni en paramètre au script, alors on recherche dans ce chemin : je serais bien pour créer un script qui prend les valeurs en paramètre en ligne de commande... Tu vois ce que je veux dire ? Par exemple, on utilise ton script en lançant "python lescript.py [répertoireDansLequelOnVaFaireLaRecherche]"
    - sinon, on va rechercher par défaut mettons dans le répertoire "Mes Documents" de l'utilisateur (ou son home sous linux)

    Tu vois ce que je veux dire ? Après ce ne sont que des suggestions mais ça me paraissait plus logique...!

  6. #6
    Membre à l'essai
    Inscrit en
    Janvier 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Janvier 2007
    Messages : 21
    Points : 13
    Points
    13
    Par défaut Ok
    Pour essayer de répondre plus précisément, il est effectivement possible de passer les arguments en ligne de commande par exemple de la manière suivante.
    Au début du script, ajouter :
    Remplacer le "programme principal" (lignes 30 jusqu'à la fin) par :
    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
     
    print 'Bonjour, et bienvenu,\nPour tout renseignement, contacter tonny.rosca@gmail.com'
    pathIn='/'
    chaine='x'
    try:
    	pathIn=sys.argv[1]
    except:
    	pass
    try:
    	chaine=sys.argv[2]
    except:
    	pass
    sortie=searchCode(pathIn,chaine)
    for i in range(0,len(sortie)):
    	print 'Le fichier '+str(sortie[i])+' contient la chaine recherchee.'
    Il suffit ensuite d'appeller le script via la console par exemple :
    python pySearch.py "/home" "la chaine"
    Bien entendu, ce code est perfectible (c'est le moins qu'on puisse dire ), mais j'espère qu'il vous donnera une idée sur les modifications à apporter

Discussions similaires

  1. Recherche d'une chaine dans un fichier distant
    Par nitramm dans le forum ASP
    Réponses: 3
    Dernier message: 20/08/2008, 16h49
  2. Rechercher une chaine dans un fichier
    Par bigey3 dans le forum Langage
    Réponses: 12
    Dernier message: 30/05/2008, 16h35
  3. recherche dans une plage dans des fichiers fermés
    Par kikuyu dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 17/04/2008, 10h20
  4. Rechercher une chaine dans un fichier Excel
    Par matcram dans le forum ASP
    Réponses: 1
    Dernier message: 03/10/2007, 21h59

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