使用Python解析YAML文件,以在唯一/非唯一关键字对之间提取文本blob

时间:2018-06-07 06:41:45

标签: python regex parsing yaml

我有一个程序需要能够从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,我想在这两个关键字之间返回所有文字,格式化除了可靠性之外,它没有任何要求,它必须以相同的方式一致地返回,因为它将是散列函数的输入,并且我自然地使用散列函数的输出进行diff操作,所以误报是没有用的。

我目前遇到的问题是print(metadata_blob)没有返回任何内容,它只返回给我一个空列表。

为了让您对我正在执行的操作有一个模糊的概念,我试图绕过一些AWS功能,以便在我更改LaunchConfiguration元数据时引发UpdatePolicy操作。尽管如此,这对于这个问题可能并不重要。

我对这一点感到有些失落,如果我目前解决这个问题的方法没有意义,请随意指出一个更合适的方向。

在撰写本文时,我已阅读并“借用”了一些问题。

How can I parse a YAML file in Python

How to extract information between two unique words in a large text file

1 个答案:

答案 0 :(得分:1)

考虑到您已关联的测试数据,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)

另外,不要使用try / catch或使用它做一些有用的事情。您永远不会得到yaml.YAMLError,因为您没有使用yaml模块来阅读该文件。