Разбор файла YAML с помощью Python для извлечения текстового блоба между уникальной / неуникальной парой ключевых слов - PullRequest
0 голосов
/ 07 июня 2018

У меня есть программа, которой требуется возможность извлекать текстовый блок из файла YAML, хэшировать его, сравнивать с последним «запуском» и затем принимать решение по результату.Рассматриваемый код:

 21     def parse_file(self):                                                        
 22     ¦   webservers_template = os.path.abspath('templates/webservers.yaml')       
 23     ¦   with open(webservers_template, 'rb') as stream:                          
 24     ¦   ¦   try:                                                                 
 25     ¦   ¦   ¦   print(stream.read())                                             
 26     ¦   ¦   ¦   metadata_blob = re.findall(r'\n    Metadata:(.*?)\n    Properties:', str(stream)
    )                                                                                               
 27     ¦   ¦   ¦   print(metadata_blob)                                             
 28     ¦   ¦   ¦   return bytes(metadata_blob)                                      
 29     ¦   ¦   except yaml.YAMLError as exc:                                        
 30     ¦   ¦   ¦   print(exc)        

Файл templates/webservers.yaml представляет собой шаблон облачной информации на основе YAML.Это выглядит примерно так: this .

Действие, которое я пытаюсь выполнить, состоит в том, что у меня есть уникальное ключевое слово Metadata и неуникальное ключевое слово Properties, и я хотел бычтобы вернуть ВСЕ текст между этими двумя ключевыми словами, форматирование этого не имеет никаких требований, кроме надежности, оно должно последовательно возвращаться одинаково, так как это будет ввод для хэш-функции, и, естественно, я используювывод хеш-функции для операции сравнения, поэтому ложные срабатывания не помогут.

Проблема, с которой я сейчас сталкиваюсь, заключается в том, что print(metadata_blob) ничего не возвращает, он просто возвращает мнепустой список.

Чтобы дать вам смутное представление о выполняемом мною действии, я пытаюсь обойти некоторые функции AWS, чтобы вызвать действия UpdatePolicy при изменении метаданных LaunchConfiguration.Это, вероятно, не важно в отношении вопроса.

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

Некоторые вопросы, которые я прочитал и «заимствовали» идеи, когда писали это.

Как я могу проанализировать файл YAML в Python

Как извлечь информацию из двух уникальных слов в большой текстовый файл

1 Ответ

0 голосов
/ 07 июня 2018

Принимая во внимание тестовые данные, которые вы связали, print(metadata_blob) совершенно подходит для возврата пустого списка, поскольку в YAML нет Metadata:.

Что более важно, вы делаете print(stream.read()), чточитает весь файл и помещает позицию потока в конец файла .После этого каждая попытка чтения из stream ничего не возвращает.Мой Python недостаточно силен, чтобы знать, что именно происходит, когда вы делаете str(stream), но это определенно не обычный способ чтения чего-либо из файла.

Попробуйте это:

contents = stream.read()
print(contents)
metadata_blob = re.findall(r'\n    Metadata:(.*?)\n    Properties:', contents)

Кроме того, покончить с попыткой / поймать или сделать что-нибудь полезное с ним.Вы никогда не получите yaml.YAMLError, потому что вы не используете модуль yaml для чтения файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...