2013-01-16 17 views
35

Ich habe eine Datei, die yaml Lese YAML in 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 

Ich bin in der Lage zu lesen, das richtig in Perl YAML aber nicht in Python mit YAML wie

aussieht. Es schlägt mit dem Fehler:

expected a single document in the stream

Programm:

import yaml 

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

Fehler:

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

Zur Bezugnahme siehe Kapitel 2 (Syntax) von http://www.yaml.org/spec/1.2 /spec.html. Es ist ein 5 Minuten gelesen und es wert. – Titou

+0

Siehe [Wie kann ich eine YAML-Datei in Python analysieren] (https://stackoverflow.com/a/42054860/562769) –

Antwort

58

Die yaml Dokumente durch --- getrennt sind, und wenn ein Strom (zB eine Datei) enthält mehr als ein Dokument, dann sollten Sie die yaml.load_all Funktion statt yaml.load verwenden. Der Code:

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

Ergebnisse in der Eingabedatei, wie in der Frage zu finden:

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

Diese Antwort funktioniert. Für zukünftige Nachfahren verwenden sie das PyYAML-Modul, also müssen Sie 'pip install pyyaml' installieren, damit es funktioniert. – wetjosh