Recherche multifichier d’un motif

Recherche d’un motif (expression régulière) dans les fichiers de l’arborescence d’un dossier.

Remarque les fichiers sont fournis sous forme de motif (regex) ce qui permet de ne parcourir qu’une famille de fichiers.

 

#-*-coding: utf-8-*-
 
import glob
import re,os
 
 
def listdir(path, regx_fichier): 
    """
        retourne tous les fichiers du dossier et de ses sous dossiers 
        correspondant au motif. Si le motif est ''  retourne tous les fichiers
        ATTENTION: le motif du fichier est une expression régulière
    """
    import glob 
    import os
    import re
    fichier=[] 
    l = glob.glob(path+'\\*') 
    for i in l: 
        if os.path.isdir(i): 
            fichier.extend(listdir(i,regx_fichier))
        else:
            if regx_fichier:
                if re.match(regx_fichier,os.path.split(i)[-1],re.I):
                    fichier.append(i)
            else:
                fichier.append(i)
    return fichier
 
 
def recherche(pathRoot, regx_fichier, regx_expr):
    """
        recherche d'une expression regulière dans les fichiers
        contenus dans le dossier pathRoot ou un de ses sous dossiers
        ATTENTION: le motif du fichier est une expression régulière
    """
    if not os.path.exists(pathRoot):
        print 'Le chemin fourni est inaccessible'
        exit()
     
    regex= re.compile(regx_expr,re.I) 
 
    fichiers=listdir(pathRoot,regx_fichier)
 
    F=[]
    for f in fichiers:
        txt= open(f,'r').read()
        match=regex.findall(txt)
        if match:
            F.append(f)
            print f
            for s in regex.findall(txt):
                print '\t',s
 
    print '%i FICHIERS PARCOURUS\nLISTE DES FICHIERS CONTENANT LE MOTIF'% len(fichiers)
    print 
    for f in F:
        print f
 
def rgx_fichier(ext):
    """
        Construit l'expression regulière correspondant à l'extension fournie
    """
    return r'.*\.'+ext
 
 
 
# USAGE
# recherche(r'c:\home',rgx_fichier('py'),'ht..')
recherche (r'/','.*\.sql','USE\t.*')

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *