在python中读取YAML文件,最后用`---`开头

时间:2017-12-01 12:44:25

标签: python yaml pyyaml

使用

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规定allow

  

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中?

2 个答案:

答案 0 :(得分:3)

您的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'}

答案 1 :(得分:1)

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

获取第一个文档
list(yaml.safe_load_all(stream))[0]

但是,...导致PyYaml中断并且您可能想要将其报告为错误,这似乎很奇怪。