#python #regex #python-3.x
#python #регулярное выражение #python-3.x
Вопрос:
Я пишу скрипт на Python 3.7.2, который использует re.compile для поиска по всем файлам в каталоге и возвращает каждую строку, в которой появляется определенная строка. Это работает нормально, за исключением двух проблем:
- В каталоге несколько сотен файлов, но скрипт выполняется только для первых 25.
- Затем он повторно выполняется для первых 25 на неопределенный срок.
Есть предложения? Вот сценарий:
import os
import re
err_occur = []
pattern = re.compile(r"An important phrase")
path = "/users/mypath/"
for filename in os.listdir(path):
try:
with open(os.path.join(path, filename), encoding="UTF-8") as in_file:
for linenum, line in enumerate(in_file):
if pattern.search(line) != None:
err_occur.append((linenum, line.rstrip('n')))
for linenum, line in err_occur:
print(line, sep='')
except FileNotFoundError:
print("Input file not found.")
Комментарии:
1. Что выводится, если поместить эту строку перед первым циклом for : print(len(os.listdir(path)))
2. Вы пробовали
os.walk
?3. Удалите строку
for line in in_file:
. Вы уже используете enumerate наin_file
.4. @Nick — к сожалению, изменений нет
5. @Henry Yik — спасибо, приведенный выше код обновлен.
Ответ №1:
Я думаю, что ваша проблема может быть с отступом.
Я переместил часть кода и снял индентирование с внутреннего цикла for. Попробуйте этот код:
import os
import re
err_occur = []
pattern = re.compile(r"An important phrase")
path = "/users/mypath/"
for filename in os.listdir(path):
try:
with open(os.path.join(path, filename), encoding="UTF-8") as in_file:
for linenum, line in enumerate(in_file):
if pattern.search(line) != None:
err_occur.append((linenum, line.rstrip('n')))
except FileNotFoundError:
print("Input file not found.")
for linenum, line in err_occur:
print(line, sep='')
Комментарии:
1. Фантастика, это делает именно то, что я хотел. Большое спасибо!