我有一个程序需要能够从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
答案 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
模块来阅读该文件。