Я новичок в написании сценариев и читал на Python около 6 недель. Нижеследующее предназначено для чтения файла журнала и отправки предупреждения, если найдено одно из ключевых слов, определенных в srchstring
. Он работает так, как ожидалось, и не предупреждает о найденных ранее строках, как и ожидалось. Однако файл, обрабатывающий его, активно записывается приложением, а скрипт слишком медленный в файлах размером около 500 Мб. до 200 мб работает отлично, т. е. в течение 20 секунд. Может ли кто-нибудь предложить более эффективный способ поиска строки в файле на основе предварительно определенного списка?Эффективный способ найти строку по списку
import os
srchstring = ["Shutdown", "Disconnecting", "Stopping Event Thread"]
if os.path.isfile(r"\\server\\share\\logfile.txt"):
with open(r"\\server\\share\\logfile.txt","r") as F:
for line in F:
for st in srchstring:
if st in line:
print line,
#do some slicing of string to get dd/mm/yy hh:mm:ss:ms
# then create a marker file called file_dd/mm/yy hh:mm:ss:ms
if os.path.isfile("file_dd/mm/yy hh:mm:ss:ms"): # check if a file already exists named file_dd/mm/yy hh:mm:ss:ms
print "string previously found- ignoring, continuing search" # marker file exists
else:
open("file_dd/mm/yy hh:mm:ss:ms", 'a') # create file_dd/mm/yy hh:mm:ss:ms
print "error string found--creating marker file sending email alert" # no marker file, create it then send email
else:
print "file not exist"
Выполняется ли этот код? Что такое 'F'? Я предполагаю, что это файл, который вы читаете, но код не отражает этого. Кроме того, когда вы открываете файл для записи, вы его не закрываете. Питонический способ записи в файлы использует контекст: 'with open ('filename') как f: ...'. На ваш вопрос, я бы попробовал использовать 'set' вместо' list' для 'srchstring'. Затем для каждой строки в файле создайте 'set' слов в строке (например,' linset = set (line.split ('')) ') и пересечение набора настроек (см. Https: // docs. python.org/2/library/sets.html). Если он не пуст, значит, есть совпадение. Я предполагаю, что это может ускорить работу. – jorgeh
Откуда вы знаете, что накладные расходы происходят из поиска 'in'? Возможно, вы читаете весь файл в памяти, но вы не показываете этот код. Откуда берется «F»? – cdarke
Извинения, я пропустил линию, когда редактировал сообщение для правильного форматирования. Я обновил его сейчас. Я где-то читал, что вложенное «если» не может быть лучшим способом, но я не могу найти сообщение, которое это предлагало. Именно это заставило меня поверить в то, что IF может быть узким местом. – toon