10 votes

Pourquoi un script Python pour lire des fichiers fait-il émettre des bips à mon ordinateur ?

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.

18voto

J.J Points 447

Cette ligne :

print count,line,dir_element

est probablement en train d'imprimer le Caractère BEL si vous alimentez votre programme en fichiers binaires.

Pour tester, voici un petit code que j'ai écrit. Python va essayer de le jouer note pour note. Ne vous inquiétez pas. Soyez heureux :)

def bel():          return chr(7)
def wait(duration): return chr(0) * (duration*1000000)
song = ''
for _ in range(5):
    song += bel()
    song += wait(1)
    song += bel()
    song += wait(1)
    song += bel()
    song += wait(5)
print song

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X