【问题标题】:Parsing a YAML file with Python, to extract a text blob between a unique/non-unique keyword pair使用 Python 解析 YAML 文件,以提取唯一/非唯一关键字对之间的文本块
【发布时间】:2018-11-16 23:21:51
【问题描述】:

我有一个程序需要能够从 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 的 cloudformation 模板。这看起来像this

我要执行的操作是我有一个唯一关键字Metadata 和一个非唯一关键字Properties,我想返回这两个关键字之间的所有文本,它的格式不'除了可靠性之外没有任何要求,它必须始终以相同的方式返回,因为它将是散列函数的输入,自然我将散列函数的输出用于差异操作,所以误报不会乐于助人。

我目前遇到的问题是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

【问题讨论】:

    标签: python regex parsing yaml


    【解决方案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 模块来读取文件。

    【讨论】:

    • 你是个传奇。是的,所以打印语句的主要目的是帮助调试,但是第二次调用流是正确的,因为它是一个生成器,所以它什么都不返回,所以它只能被调用一次。干杯,我还没有完全解决它,但我现在让它工作在一个更好的水平,所以我应该能够从这里弄清楚。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2016-01-27
    • 2019-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-10
    • 2018-07-06
    • 1970-01-01
    相关资源
    最近更新 更多