Я написал небольшой модуль, который будет искать файлы в каталоге и во всех его подкаталогах для появления некоторой входной строки. Это было удобно несколько раз, главным образом для поиска старых сценариев, если я помню какое-то имя функции/переменной, которое я использовал.
Итак, на днях я был полностью озадачен, когда использовал функции и начал слышать, очень слабо, из наушников, сидящих на противоположной стороне моего стола, повторяя звуковые сигналы. Сначала я подумал, что кто-то звонит по телефону. Но нет, Python общался со мной через код Морзе.
Я не знаю, почему это происходит. Я продолжал выполнять функции и получать звуковые сигналы, но не всегда в одном шаблоне. Функции открывают только файлы с правами на чтение. Код точно такой:
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 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))
Чтобы запустить его, вы передаете init_crawl()
каталог для сканирования, из строки поиска и каталога для записи выходного текстового файла. Например: init_crawl(r'C:\directory-to-crawl', 'foo', r'C:\output-directory')
Я даже не знаю, какие конкретные вопросы задавать об этом, но почему это происходит? Я могу сказать, что звуковые сигналы обычно возникают, когда функция пытается читать нетекстовые файлы, такие как PDF файлы и электронные таблицы. Иногда терминал замерзает...
Вывод - это просто csv с столбцами для путей к файлам, где найдена строка, номера строк и строка, содержащая строку.