2013-01-16 16 views
35

Mam plik, który wygląda jak yamlReading YAML w Pythonie

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

jestem w stanie przeczytać poprawnie w Perl przy użyciu YAML ale nie w Pythonie przy użyciu YAML. To nie z błędem:

expected a single document in the stream

Program:

import yaml 

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

Błąd:

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

Więcej informacji można znaleźć w rozdziale 2 (składni) z http://www.yaml.org/spec/1.2 /spec.html. Jest to 5 mln przeczytać i warto. – Titou

+0

Patrz [Jak można przeanalizować plik YAML w języku Python] (https://stackoverflow.com/a/42054860/562769) –

Odpowiedz

58

Dokumenty YAML są oddzielone ---, a jeśli każdy strumień (np plik) zawiera więcej niż jeden dokument, powinieneś użyć funkcji yaml.load_all zamiast yaml.load. Kod:

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", 

prowadzi do pliku wejściowego, jak określono w kwestii:

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

Ta odpowiedź działa. Dla przyszłych potomków używają one modułu PyYAML, więc musisz 'pip install pyyaml' by działał. – wetjosh