Повторная компиляция Python для всех файлов в каталоге — не выполняется поиск по всем файлам

#python #regex #python-3.x

#python #регулярное выражение #python-3.x

Вопрос:

Я пишу скрипт на Python 3.7.2, который использует re.compile для поиска по всем файлам в каталоге и возвращает каждую строку, в которой появляется определенная строка. Это работает нормально, за исключением двух проблем:

  1. В каталоге несколько сотен файлов, но скрипт выполняется только для первых 25.
  2. Затем он повторно выполняется для первых 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. Фантастика, это делает именно то, что я хотел. Большое спасибо!