Ces*_*sco 1 python yaml pyyaml
对不起,我对YAML和PyYAML都知之甚少,但我很同意支持以"Jekyll"使用的相同风格编写的配置文件的想法(http://jekyllrb.com/docs/frontmatter/)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.
Run Code Online (Sandbox Code Playgroud)
然后我尝试使用此代码使用Python 3.4和PyYAML读取此文本文件:
import yaml
stream = open("test.yaml")
a = stream.read()
b = yaml.load(a)
Run Code Online (Sandbox Code Playgroud)
但显然它不起作用,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:
---
^
Run Code Online (Sandbox Code Playgroud)
请问你能帮帮我吗?
我是以错误的方式编写代码,还是这意味着PyYAML无法处理YAML前端块?
还有什么我可以尝试用PyYAML做的,或者我是否必须使用正则表达式编写自己的解析器?
非常感谢您的宝贵时间 !
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
Run Code Online (Sandbox Code Playgroud)
您可以通过调用来完成此操作,而无需任何自定义解析yaml.load_all()。这将返回一个生成器,其中第一项是预期的字典前面的内容,第二项是文档的其余部分作为字符串:
import yaml
with open('some-file-with-front-matter.md') as f:
front_matter, content = list(yaml.load_all(f, Loader=yaml.FullLoader))[:2]
Run Code Online (Sandbox Code Playgroud)
如果你只想要前面的内容,那就更简单了:
import yaml
with open('some-file-with-front-matter.md') as f:
front_matter = next(yaml.load_all(f, Loader=yaml.FullLoader))
Run Code Online (Sandbox Code Playgroud)
这是有效的,因为yaml.load_all()用于在同一文档中加载多个 YAML 文档,以 分隔---。另外,请确保在从未知来源加载 YAML 时采取通常的预防措施。
编辑:更新了代码以包含现在需要的Loader参数,并更新了文档链接。根据下面的评论,还验证了代码即使在内容中也能正常工作。---
| 归档时间: |
|
| 查看次数: |
2129 次 |
| 最近记录: |