J'ai écrit un petit module qui recherche dans les fichiers d'un répertoire et de tous ses sous-répertoires l'occurrence d'une chaîne de caractères. Cela a été pratique quelques fois, principalement pour retrouver de vieux scripts si je me souviens d'un nom de fonction/variable que j'ai utilisé.
J'ai donc été complètement déconcerté l'autre jour lorsque j'ai utilisé les fonctions et que j'ai commencé à entendre, très faiblement, des bips répétés provenant du casque posé de l'autre côté de mon bureau. J'ai d'abord pensé que c'était la sonnerie du téléphone de quelqu'un. Mais non, Python communiquait avec moi en morse.
Je n'ai aucune idée de la raison pour laquelle cela se produit. J'ai continué à exécuter les fonctions et à obtenir des bips, pas toujours de la même manière. Les fonctions n'ouvrent que des fichiers avec des droits de lecture. Le code est exactement le suivant :
import os
import glob
def directory_crawl_for_string(dir_name, string, ofile):
"""Crawl dir_name and all of its subdirectories, opening files and
checking for the presence of a string"""
#get input directory's listings
dir_contents = glob.glob(dir_name)
#loop over the listings
for dir_element in dir_contents:
if(os.path.isfile(dir_element)):
#read the file, checking for the string
check_for_string(dir_element, string, ofile)
else:
if(os.path.isdir(dir_element)):
directory_crawl_for_string(dir_element + '\\*', string, ofile)
def check_for_string(dir_element, string, ofile):
try:
ifile = open(dir_element, 'r')
except IOError as e:
pass
else:
count = 1
for line in ifile:
if(string in line.lower()):
print count,line,dir_element
ofile.write('%s,%d,%s' % (dir_element, count, line))
count += 1
ifile.close()
def init_crawl(start_dir, string, output_dir):
"""args:
start_dir - directory to start the crawl at
string - string to search for
output_dir - directory to write output text file inside of"""
if(output_dir):
fn = output_dir.rstrip('/').rstrip('\\') + '/dirs.txt'
else:
fn = 'dirs.txt'
ofile = open(fn, 'w')
ofile.write('file path,line number of occurance of "%s",exact line\n' % string)
directory_crawl_for_string(start_dir, string, ofile)
ofile.close()
print('list of files containing "%s" written to "%s"' % (string, fn))
Pour le démarrer, vous passez init_crawl()
le répertoire à partir duquel il faut ramper, la chaîne de caractères à rechercher, et un répertoire dans lequel écrire un fichier texte de sortie. Par exemple : init_crawl(r'C:\directory-to-crawl', 'foo', r'C:\output-directory')
Je ne sais même pas quelles questions spécifiques poser à ce sujet, mais pourquoi cela se produit-il ? Je peux dire que les bips se produisent généralement lorsque la fonction tente de lire des fichiers non textuels comme les PDF et les feuilles de calcul. Parfois, le terminal se fige également...
La sortie est juste un csv avec des colonnes pour les chemins de fichier où la chaîne est trouvée, les numéros de ligne, et la ligne contenant la chaîne.