2013-01-16 74 views
35

我有一个YAML文件看起来像阅读YAML在python

--- 
level_1: "test" 
level_2: 'NetApp, SOFS, ZFS Creation' 
request: 341570 
--- 
level_1: "test" 
level_2: 'NetApp, SOFS, ZFS Creation' 
request: 341569 
--- 
level_1: "test" 
level_2: 'NetApp, SOFS, ZFS Creation' 
request: 341568 

我能够在Perl使用YAML正确地读这一点,但使用YAML不是在蟒蛇。它失败,出现错误:

expected a single document in the stream

计划:

import yaml 

stram = open("test", "r") 
print yaml.load(stram) 

错误:

Traceback (most recent call last): 
    File "abcd", line 4, in <module> 
    print yaml.load(stram) 
    File "/usr/local/pkgs/python-2.6.5/lib/python2.6/site-packages/yaml/__init__.py", line 58, in load 
    return loader.get_single_data() 
    File "/usr/local/pkgs/python-2.6.5/lib/python2.6/site-packages/yaml/constructor.py", line 42, in get_single_data 
    node = self.get_single_node() 
    File "/usr/local/pkgs/python-2.6.5/lib/python2.6/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 "test", line 2, column 1 
but found another document 
    in "test", line 5, column 1 
+0

对于参考文献参见http://www.yaml.org/spec/1.2的第2章(语法) /spec.html。这是一个5分钟的阅读和值得。 – Titou

+0

请参阅[如何使用Python解析YAML文件](https://stackoverflow.com/a/42054860/562769) –

回答

58

YAML的文件由---分离,如果任何流(例如文件)中含有较多那么您应该使用yaml.load_all函数而不是yaml.load。的代码:

import yaml 

stream = open("test", "r") 
docs = yaml.load_all(stream) 
for doc in docs: 
    for k,v in doc.items(): 
     print k, "->", v 
    print "\n", 

导致用于如在问题中提供的输入的文件:

request -> 341570 
level_1 -> test 
level_2 -> NetApp, SOFS, ZFS Creation 

request -> 341569 
level_1 -> test 
level_2 -> NetApp, SOFS, ZFS Creation 

request -> 341568 
level_1 -> test 
level_2 -> NetApp, SOFS, ZFS Creation 
+17

此答案适用。对于将来的后代,他们使用PyYAML模块,所以你必须'pip安装pyyaml'才能工作。 – wetjosh