Мне нужно сканировать каталог для ex: C:\Users\Jack\Work
и искать имя файла, в котором есть Worklog_201810716_081.log
текстовые части, например: Worklog_201810716_081.log
.
Может кто-нибудь, пожалуйста, помогите мне, как я могу использовать regexp в своем коде для поиска имени файла.
Я применил следующий жесткий код с именем файла:
reg_lst = ["Error in log"]
for i, line in enumerate(open("C:\\Users\\Jack\Work\\Worklog_201810716_081.log")):
if any(compiled_reg.match(line) for compiled_reg in reg_lst):
print("Found on line %s" % (i+1))
print("Log msg: ", line)
Это выводит сообщение после Error in log
Worklog_201810716_081.log
.
Мне нужно написать общий код, где мне нужно также сканировать другие файлы журналов в каталоге для текстового поиска.
используйте glob.glob
или os.scandir
или fnmatch.fnmatch
.
Попробуйте glob(r'C:\Users\Jack\Work\*.log')
в пакете glob
. Это должно показать список файлов .log
файлов в каталоге C:\Users\Jack\Work
.
Неподтвержденный код:
from glob import glob
reg_lst = ["Error in log"]
for filename in glob(r'C:\Users\Jack\Work\*.log'):
with open(filename, 'r') as f:
for i, line in enumerate(f.readlines()):
if any(compiled_reg.match(line) for compiled_reg in reg_lst):
print("Found on line %s" % (i+1))
print("Log msg: ", line)
Я смог написать следующий код, и он работает успешно.
reg_lst = ["Error in log"]
work_path = "C:\Users\Jack\Work\"
for file in os.listdir(work_path):
if fnmatch.fnmatch(file, '*.log'):
for i, line in enumerate(open(os.path.join(work_path,file))):
if any(compiled_reg.match(line) for compiled_reg in reg_lst):
print("Found on line %s" % (i+1))
print("Log msg: ", line)
Он ищет все файлы журнала в каталоге work_path
и ищет текст "Error in log"
и печатает номер строки и все текстовое сообщение в этой строке.
regex
. он называетсяUnix shell-style wildcard
fnmatch
вUnix shell-style wildcard
илиfnmatch
как упомянуто на docs.python.org/3.6/library/fnmatch.html#module-fnmatch