Python 是否可以使用PyYAML来读取用“";“YAML前沿问题”;在里面堵?

Python 是否可以使用PyYAML来读取用“";“YAML前沿问题”;在里面堵?,python,yaml,pyyaml,Python,Yaml,Pyyaml,很抱歉,我对YAML和PyYAML都知之甚少,但我喜欢支持以“Jekyll”()使用的相同样式编写的配置文件的想法,因为AFAIK有这些“YAML Front Matter”块,在我看来非常酷和性感。 因此,我在我的计算机上安装了PyYAML,并用以下文本块编写了一个小文件: --- First Name: John Second Name: Doe Born: Yes --- Lorem ipsum dolor sit amet, consectetur adipiscing elit,

很抱歉,我对YAML和PyYAML都知之甚少,但我喜欢支持以“Jekyll”()使用的相同样式编写的配置文件的想法,因为AFAIK有这些“YAML Front Matter”块,在我看来非常酷和性感。
因此,我在我的计算机上安装了PyYAML,并用以下文本块编写了一个小文件:

---
First Name: John
Second Name: Doe
Born: Yes
---

Lorem ipsum dolor sit amet, consectetur adipiscing elit,  
sed do eiusmod tempor incididunt ut labore et dolore magna  
aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco 
laboris nisi ut aliquip ex ea commodo consequat.
然后,我尝试使用Python 3.4和PyYAML通过以下代码读取此文本文件:

import yaml

stream = open("test.yaml")
a = stream.read()
b = yaml.load(a)
但显然它不起作用,Python显示以下错误消息:

Traceback (most recent call last):
  File "<pyshell#62>", line 1, in <module>
    b = yaml.load(a)
  File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/yaml/__init__.py", line 72, in load
    return loader.get_single_data()
  File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/yaml/constructor.py", line 35, in get_single_data
    node = self.get_single_node()
  File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/yaml/composer.py", line 43, in get_single_node
    event.start_mark)
yaml.composer.ComposerError: expected a single document in the stream
  in "<unicode string>", line 2, column 1:
    First Name: John
    ^
but found another document
  in "<unicode string>", line 5, column 1:
    ---
    ^
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
b=yaml.荷载(a)
文件“/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site packages/yaml/_init__.py”,第72行,已加载
返回加载器。获取单个数据()
文件“/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site packages/yaml/constructor.py”,第35行,在get_single_数据中
node=self.get\u single\u node()
文件“/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site packages/yaml/composer.py”,第43行,在get_single_节点中
事件。开始(标记)
yaml.composer.composer错误:流中应为单个文档
在“”第2行第1列中:
名字:约翰
^
但是找到了另一份文件
在“”第5行第1列中:
---
^
你能帮帮我吗?
我是否以错误的方式编写了代码,或者这是否意味着PyYAML无法处理YAML前端块?
我还可以用PyYAML做些什么,或者我必须使用regex编写自己的解析器吗


非常感谢您抽出时间

Python
yaml
库不支持读取嵌入在文档中的yaml。下面是一个提取yaml文本的实用函数,因此您可以在读取文件的其余部分之前对其进行解析:

#!/usr/bin/python2.7

import yaml
import sys

def get_yaml(f):
  pointer = f.tell()
  if f.readline() != '---\n':
    f.seek(pointer)
    return ''
  readline = iter(f.readline, '')
  readline = iter(readline.next, '---\n')
  return ''.join(readline)


for filename in sys.argv[1:]:
  with open(filename) as f:
    config = yaml.load(get_yaml(f))
    text = f.read()
    print "TEXT from", filename
    print text
    print "CONFIG from", filename
    print config

您可以通过调用
yaml.load\u all()
来完成这一任务,而无需任何自定义解析。这将返回一个生成器,其中第一项作为dict作为预期的前端内容,第二项作为字符串作为文档的其余部分:

import yaml

with open('some-file-with-front-matter.md') as f:
    front_matter, content = list(yaml.load_all(f, Loader=yaml.FullLoader))[:2]
如果您只想了解前沿问题,则更简单:

import yaml

with open('some-file-with-front-matter.md') as f:
    front_matter = next(yaml.load_all(f, Loader=yaml.FullLoader))
这是因为,由
--
分隔。另外,当从未知源加载YAML时,请确保采取通常的预防措施


编辑:更新了代码以包含
加载程序
参数,并更新了文档链接。还验证了即使内容中有
--
,代码也能正常工作,请参见下面的注释。

您可以获取三个破折号之间的文本,并将其传递给yaml加载程序。Bla blabla部分也是yaml文档吗?谢谢您的建议。“Blabla”部分不是YAML。基本上,它是一个文本文件,开头有一个YAML部分,最后三个破折号后有一个正常的非YAML部分。非常感谢您的回答谢谢您花时间回答我的问题如果内容包含
--
,此代码将中断。如果有人正在分析降价,所有的
#
都将被忽略。@我刚刚再试了一次,即使内容中有
--
,它也能正常工作。也许从那以后的几年里,Pyaml发生了一些变化。这是一个非常脆弱的东西,它看起来可以工作,但会断裂<代码>--如果在其自己的行中,则不起作用,无论版本如何。Pyaml 5.4.1(2021年)、3.12(2016年)或3.11(2014年)。这就是yaml的工作原理。这是一份新文件的标记。其他问题:从内容中删除空白。如果有任何类似于有效yaml的行(尝试
a:b
),则抛出
yaml.scanner.ScannerError:此处不允许映射值