Accueil > > > RECHERCHE DE CHAINES DANS UN REPERTOIRE AVEC IGU
RECHERCHE DE CHAINES DANS UN REPERTOIRE AVEC IGU
Information sur la source
Description
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. L'interface graphique étant réalisée avec la classe Tkinter. 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'.
Source
- 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()
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()
Conclusion
Pour avoir la version exécutable pour windows, ou tout simplement motiver ma participation, visitez mon site ;-) http://gdaveau.free.fr
Sources du même auteur
Sources de la même categorie
TPYCODE, TRADUCTEUR DE CODETPYCODE, TRADUCTEUR DE CODE Bonjour à tous,
Ce programme ne sert pas à grand chose mais c'est mon premier donc pour un début, ça me convient.
Utilisation :
Au lieu d'écri...
par jonathan33350
INVERSEUR DE CHAÎNE DE CARACTÈRE [INTERFACE GRAPHIQUE]INVERSEUR DE CHAÎNE DE CARACTÈRE [INTERFACE GRAPHIQUE]Un petit programme qui inverse une chaîne de caractère saisie par l'utilisateur. Egalement inspiré d'un exercice issus de "Apprendre à Programmer avec...
par SeventhSon
GÉNÉRATEUR DE PASSWORDGÉNÉRATEUR DE PASSWORDVoilà, un petit générateur de mot de passe à exécuter dans un terminal, j'avais pas trop d'idée, donc j'ai transformer mon script bash en script pytho...
par PlugnPlay666
VOCABULARY, RÉVISER SON VOCABULAIRE PÉDAGOGIQUEMENTVOCABULARY, RÉVISER SON VOCABULAIRE PÉDAGOGIQUEMENTcela fait un certain temps que je songeais a créer un programme qui permette de réviser son vocabulaire de manière pédagogique, c'est fait. avec vocab...
par Clempython
PROGRAMME POUR LES MOTS CROISÉSPROGRAMME POUR LES MOTS CROISÉSvoici un petit programme très simple qui ouvre un dico et demande à l'utilisateur un mot avec des espaces et cherche dans le dictionnaire si un mot pe...
par Clempython
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
Ouverture d'un fichier windows (avec Tkinter) [ par Uims ]
Bonjour, Je travaille sous python et Tkinter et j'aurai voulu savoir comment dire a python de demarrer (comme on clique sur un fichier) une applicati
Développement particulier [ par davidoff73 ]
Bonjour, <p class="MsoNormal" st
Débutant, complètement perdu... [ par Mgiv64 ]
Bonjour à tous, J'ai programmé une petite application qui réalise des backup d'un fichier de données (d'une application comptable).Mon programme loca
Remplacement d'une chaine de caractère dans un fichier *.txt [ par Boy63 ]
Bonjour,J'aimerais savoir comment remplacer une partie précise d'une chaine de caractère par une autre dans un fichier *.txt. Je m'explique un peu plu
Fichiers en python [ par darfeuille ]
Salut, Etant novice en python, je bloque sur un truc : Dans un de mes programmes, a un moment, je dois recopier un fichier (en le modi
Convertir chaine de caractère [ par basmaber ]
Bonsoir J'ai créé un programme qui récupère des données provenant d'un fichier texte qui contient plusieurs valeurs 10 colonnes et 63 lignes. Les donn
Recherche de chaine [ par DoudouBidou ]
Bonjour, je souhaite faire une recherche de chaine dans un texte et je pense que le module a utilisé est re mais j'ignore comment. Je voudrais
Recherche de mots dans un fichier [ par Malrod ]
Bonjour. Je débute en python et j'aimerais me faire un "moteur de recherche" pour fouiller dans des fichiers. J'aimerais ici demander la recherche
comparer les valeurs d'un tableau [ par basmaber ]
bonjour, je suis débutante en phyton et je dois faire un programme qui permet d'ouvrir un fichier txt de ce genre : "I1";15.;100.;120.;80. .... et ap
lire et comparer les valeurs d'un fichier [ par basmaber ]
Bonjour, j'ai crée une boucle qui lit et compare les valeur d'un fichier , mais le problème ma boucle fonctionne pour toute les valeurs sauf une je ne
|
Derniers Blogs
CSS CONTENT STATE SELECTORS (PERSONNAL DRAFT)CSS CONTENT STATE SELECTORS (PERSONNAL DRAFT) par FREMYCOMPANY
Bonjour à tous, Je viens de publier une proposition comprenant 5 pseudo-classes pour le CSS Working Group ayant trait à l'état de chargement d'un élément (ex: IMG,VIDEO,AUDIO,OBJECT pour l'HTML.). Si le c½ur vous en dit, vous pouvez retrouver cette p...
Cliquez pour lire la suite de l'article par FREMYCOMPANY MBA : POURQUOI FAIRE ET COMMENT LE CHOISIR ?MBA : POURQUOI FAIRE ET COMMENT LE CHOISIR ? par ROMELARD Fabrice
Formation initiale Durant la formation, le découpage classique est le suivant (je donnerai les équivalences Suisse lorsque je les connaîtrais) : Ecole primaire jusqu'au Collège : Formation générale permettant d'obtenir les méthodes...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice Y'A DES ERREURS QUI PEUVENT RENDRE LE DéVELOPPEUR VIOLENTY'A DES ERREURS QUI PEUVENT RENDRE LE DéVELOPPEUR VIOLENT par Aleks
Quand on a ce genre d'erreur sans log :
Et bas on a juste envie de choper le gas de Microsoft qu'a développé ça et lui foutre des baffes de Coboye ! ...
Cliquez pour lire la suite de l'article par Aleks [HYPER-V 3] PRéSENTATION DES COMMANDLETS POWERSHELL[HYPER-V 3] PRéSENTATION DES COMMANDLETS POWERSHELL par Pierrick CATRO-BROUILLET
Avec la sortie prochaine de la Beta Consumer Preview de Windows 8, j'avais envie de revenir sur une des fonctionnalités que j'attends le plus et que, en bon geek que je suis, j'utilise déjà : Hyper-V 3 ainsi son module PowerShell.
Il y a déjà pléthor...
Cliquez pour lire la suite de l'article par Pierrick CATRO-BROUILLET IIS7 - COMPRESSION GZIPIIS7 - COMPRESSION GZIP par cyril
La compression GZIP permet d'améliorer les performances de navigation en compressant ce qu'envoie le serveur à un client. Pour comprendre comment cela fonctionne, regardons ce qu'il se passe au niveau HTTP lorsqu'un client tente d'accéder à une ress...
Cliquez pour lire la suite de l'article par cyril
Forum
PYVISA PROBLèMEPYVISA PROBLèME par sandrine44
Cliquez pour lire la suite par sandrine44
Logiciels
Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning Academy System (17.1.3.0)ACADEMY SYSTEM (17.1.3.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System COLLECTOR PLUS (3.00B)COLLECTOR PLUS (3.00B)COLLECTOR PLUS version 3.00B est un logiciel utilisant une base de données alimentée par :
- L... Cliquez pour télécharger COLLECTOR PLUS PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO LettresFaciles 2011 (8.0.0.1)LETTRESFACILES 2011 (8.0.0.1)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011
|