Как циклически использовать список в качестве регулярного выражения для поиска файла

#python-3.x

#python-3.x

Вопрос:

В настоящее время я занимаюсь проектом, который требует от меня поиска в файле определенных команд и печати номера строки. Моя проблема возникает из-за большого количества команд, которые необходимо искать одну за другой.

 bad_commands = ['Get-ComputerInfo', 'Invoke-Item']
transcript = open("transcripts/transcript.txt", "r")

for command in bad_commands:
     if re.search(command, transcript):
          print(command[], " has been found within the file")
     else:
          print("clean")
  

Сам файл находится Get-ComputerInfo внутри него, поэтому он должен быть распечатан Get-ComputerInfo has been found within the file . Вместо этого я просто получаю ошибку при запуске скрипта. Ошибка гласит

 Traceback (most recent call last):
     if re.search(command, transcript):

TypeError: expected string or bytes-like object
  

Ответ №1:

Используйте transcript.read() , чтобы получить строку содержимого файла (с возможностью поиска).

open Функция возвращает файловый объект, как указано в документах: Open file and return a corresponding file object. If the file cannot be opened, an OSError is raised. , но regex.search ожидает получить string or bytes-like object то, что указано в ошибке.

Кстати, нет необходимости использовать re.search just do if command in transcript.read(): , поскольку вы на самом деле не ищете строки регулярных выражений.

Комментарии:

1. это помогает. Единственная проблема заключается в том, что он может запускаться только один раз. после запуска кода мне придется перезапустить его, поскольку, похоже, он не перезапускает поиск по списку. есть предложения?

2. Правильно, назначьте строку в переменную, например, content = transcript.read() , и используйте content для своих тестов.