当前位置: 首页 > 知识库问答 >
问题:

在python中读取以“---”结尾和开头的YAML文件

桓宜
2023-03-14

具有

stream = open(afile, 'r')
self.meta = yaml.load(stream)

您可以轻松地在python中读取YAML文件,但它没有得到---在末尾我到达错误(与相同...):

yaml.composer.ComposerError: expected a single document in the stream
  in "El-punt-de-llibre.md", line 2, column 1
but found another document
  in "El-punt-de-llibre.md", line 6, column 1

但YAML规范允许:

YAML使用三个破折号(“--”)将指令与文档内容分开。如果没有指令,这也可以作为文档开始的信号。三个点(“…”)指示文档的结束,但不启动新文档,用于通信通道。

那么,你怎么看这个

---
title: "El punt de llibre"
abstract: "Estimar a quina pàgina està el punt de llibre"
keywords: ["when", "activitat", "3/3", "grup", "estimació", "aproximació", "funció lineal - proporcionalitat", "ca"]
comments: true
...

在python中?

共有3个答案

范文昌
2023-03-14

使用ruamel。yaml文件,用于处理带有注释和空格的yaml文件

import ruamel.yaml
yaml = ruamel.yaml.YAML()
with open(yaml_file) as f:
    for doc in yaml.load_all(f):
        print(doc)           
钱锐
2023-03-14

如果您的YAML源包含多个文档,则可以使用

list(yaml.safe_load_all(stream))[0]

然而,一个<代码> 导致PyYaml中断,您可能希望将其报告为bug。

洪梓
2023-03-14

您的YAML流/文件中似乎不止有文档,例如,尝试解析它会给出相同的错误消息:

---
title: "El punt de llibre"
abstract: "Estimar a quina pàgina està el punt de llibre"
keywords: ["when", "activitat", "3/3", "grup", "estimació", "aproximació", "funció lineal - proporcionalitat", "ca"]
comments: true
...
---
title: "El punt de llibre"
abstract: "Estimar a quina pàgina està el punt de llibre"
keywords: ["when", "activitat", "3/3", "grup", "estimació", "aproximació", "funció lineal - proporcionalitat", "ca"]
comments: true
...
---
title: "El punt de llibre"
abstract: "Estimar a quina pàgina està el punt de llibre"
keywords: ["when", "activitat", "3/3", "grup", "estimació", "aproximació", "funció lineal - proporcionalitat", "ca"]
comments: true
...

要处理此类流,您可以使用以下方法:

import yaml

with open('test.yaml') as f_yaml:
    for doc in yaml.safe_load_all(f_yaml):
        print doc

这将向您展示以下内容:

{'keywords': ['when', 'activitat', '3/3', 'grup', u'estimaci\xf3', u'aproximaci\xf3', u'funci\xf3 lineal - proporcionalitat', 'ca'], 'abstract': u'Estimar a quina p\xe0gina est\xe0 el punt de llibre', 'comments': True, 'title': 'El punt de llibre'}
{'keywords': ['when', 'activitat', '3/3', 'grup', u'estimaci\xf3', u'aproximaci\xf3', u'funci\xf3 lineal - proporcionalitat', 'ca'], 'abstract': u'Estimar a quina p\xe0gina est\xe0 el punt de llibre', 'comments': True, 'title': 'El punt de llibre'}
{'keywords': ['when', 'activitat', '3/3', 'grup', u'estimaci\xf3', u'aproximaci\xf3', u'funci\xf3 lineal - proporcionalitat', 'ca'], 'abstract': u'Estimar a quina p\xe0gina est\xe0 el punt de llibre', 'comments': True, 'title': 'El punt de llibre'}
 类似资料:
  • 问题内容: 如何在python中实现诸如“ head”和“ tail”命令之类的东西,并通过文本文件的行向后读取? 问题答案: 这是我的个人文件类;-) 用法示例:

  • demo.yaml definitions.yaml文件数据 我想读取 yaml 文件及其折射数据。 输出结果={content':{application/json':{'schema':{'title':'YamlTitle','type':'object','properties':{'name':{'type':'string','minLength':10,'example':'GANE

  • 这是我的文字: 以下是我希望使用< code>VSCode regex,或任何你可能知道的扩展。 知道吗?谢谢! 编辑:我可能需要精确地说明我想在12000多个文件上实现这一点。所以无法想象手动执行此操作。.而且我还没有找到任何扩展,也没有关于这个主题的答案。

  • 我试图搜索以下两个案例 我想搜索一个以特定单词开头的名称。例如: 名称:测试名称 名称:名称测试 名称:测试名称测试 如果我搜索“test”,那么它应该只返回“test name”和“test name test”。 我想搜索一个以特定单词结尾的名称。例如: 名称:测试名称 名称:名称测试 名称:测试名称测试 如果我搜索“测试”,那么它应该只返回“名称测试”和“测试名称测试”。 有人能帮我找出查询

  • 我在Mule中定义了以下YAML属性文件。 YAML属性文件 我知道要获得名称,我应该使用“#[p('table.customers.name')]。 我想知道的是,有没有任何方法可以通过传递.name来获取密钥,比如table。键或表。$。我的意思是,如果我通过customerID,我应该得到关键的“客户”。类似地,如果我传递orderDateMin,orderDate Max,它应该返回“or

  • 我想用OpenCSV和Java来计算一个特定的。我的csv文件有。然后,我想解析文件的每一行并做一些事情。我发现了一些与我的问题类似的问题,这些问题最常见的答案是使用循环来计算行数,因为CSVReader类没有计算它正在读取的文件行数的函数。我的问题是这样的:在我数完行数之后,有没有办法在第一次循环之后从头开始读取文件,而不创建新的CSVReader对象和字符串缓冲区?提前感谢。 编辑:我最终使用