2017-03-18 145 views
1

YAML文件我有一個yaml文件看起來像這樣:錯誤而讀取蟒蛇

%YAML 1.0 
temp: !!opencv-matrix 
rows: 2 
cols: 23 
dt: f 
data: [ 3.35620789e+02, 3.64299591e+02, 3.95790131e+02, 
    4.39863068e+02, 4.68664948e+02, 4.93518127e+02, 4.17159943e+02, 
    4.21060364e+02, 3.99990234e+02, 4.17867157e+02, 4.34151215e+02, 
    3.56201202e+02, 3.77741028e+02, 3.87051544e+02, 3.76879913e+02, 
    4.42746796e+02, 4.52483917e+02, 4.73469604e+02, 4.52954742e+02, 
    3.78402283e+02, 4.17679047e+02, 4.50588501e+02, 4.16388153e+02, 
    9.05276794e+01, 9.21245193e+01, 1.02799362e+02, 9.93146744e+01, 
    8.40704346e+01, 7.84236526e+01, 1.15820358e+02, 1.76747055e+02, 
    1.61153061e+02, 1.68130676e+02, 1.58446228e+02, 1.07421455e+02, 
    1.03407494e+02, 1.05380608e+02, 1.08374542e+02, 1.01048920e+02, 
    9.76309204e+01, 9.83933716e+01, 1.02486870e+02, 1.71890350e+02, 
    1.81417206e+02, 1.66303802e+02, 1.95539871e+02 ] 

它基本上是一個opencv matrix和我創建了一個c++代碼的文件。現在我想讀python這個文件,我有這樣的代碼:

import yaml 
with open("reference_3d.yml") as fin: 
    rfr = yaml.load(fin.read()) 

但是當我運行的代碼,它給了我這個錯誤:

Traceback (most recent call last): 
File "scatter_plot.py", line 15, in <module> 
rfr = yaml.load(fin.read()) 
File "/usr/local/lib/python2.7/site-packages/yaml/__init__.py", line 71, in load 
return loader.get_single_data() 
File "/usr/local/lib/python2.7/site-packages/yaml/constructor.py", line 37, in get_single_data 
node = self.get_single_node() 
File "/usr/local/lib/python2.7/site-packages/yaml/composer.py", line 35, in get_single_node 
if not self.check_event(StreamEndEvent): 
File "/usr/local/lib/python2.7/site-packages/yaml/parser.py", line 98, in check_event 
self.current_event = self.state() 
File "/usr/local/lib/python2.7/site-packages/yaml/parser.py", line 157, in parse_implicit_document_start 
return self.parse_document_start() 
File "/usr/local/lib/python2.7/site-packages/yaml/parser.py", line 174, in parse_document_start 
self.peek_token().start_mark) 
yaml.parser.ParserError: expected '<document start>', but found '<scalar>' 
in "<string>", line 2, column 2: 
temp: !!opencv-matrix 
^ 

任何想法,我應該如何解決這個錯誤?

+0

@karthikr請小心處理重複的問題。您指出的問題中的YAML文件與該問題中的文件以及其他情況之間的差異很微妙,但很重要。有一個更好的方法,然後採取斧頭和削減前兩行來解決**這個問題,並不適用於你指示爲重複的問題。所以一個可能的答案只能在這裏,並且不能添加到重複。 – Anthon

回答

2

這裏的問題是,你的C++生成(無效的)YAML 1.0,你試圖用一個可以處理大多數YAML 1.1的Python解析器來解析它。

YAML 1.0 specification沒有很多例子,但對於文件的指令規定,可選c-ns-directive後應文檔開始(rules 48 and 49)和規範clearly states that its form should be %YAML:1.0進來的文件頭。因此,一個正確的YAML 1.0文檔應該這樣開始:

--- 
%YAML:1.0 

然而,即使這是正確輸出PyYAML將無法讀取此舊版本YAML文件。

由於最新的YAML規範(1.2)是從2009年開始的,所以您可以做的最好的事情是將您的C++程序和Python程序切換到兼容的1.2庫庫。在yaml.org它表明,對於C++,這將是yaml-cpp和Python的這將不得不是ruamel.yaml(免責聲明:我是該包的作者)。

的YAML文件看起來像(yaml-cpp可能會改變標籤,甚至轉儲的其餘部分):

%YAML 1.2 
--- 
temp: !!opencv-matrix 
rows: 2 
cols: 23 
dt: f 
data: [ 3.35620789e+02, 3.64299591e+02, 3.95790131e+02, 
    4.39863068e+02, 4.68664948e+02, 4.93518127e+02, 4.17159943e+02, 
    4.21060364e+02, 3.99990234e+02, 4.17867157e+02, 4.34151215e+02, 
    3.56201202e+02, 3.77741028e+02, 3.87051544e+02, 3.76879913e+02, 
    4.42746796e+02, 4.52483917e+02, 4.73469604e+02, 4.52954742e+02, 
    3.78402283e+02, 4.17679047e+02, 4.50588501e+02, 4.16388153e+02, 
    9.05276794e+01, 9.21245193e+01, 1.02799362e+02, 9.93146744e+01, 
    8.40704346e+01, 7.84236526e+01, 1.15820358e+02, 1.76747055e+02, 
    1.61153061e+02, 1.68130676e+02, 1.58446228e+02, 1.07421455e+02, 
    1.03407494e+02, 1.05380608e+02, 1.08374542e+02, 1.01048920e+02, 
    9.76309204e+01, 9.83933716e+01, 1.02486870e+02, 1.71890350e+02, 
    1.81417206e+02, 1.66303802e+02, 1.95539871e+02 ] 

這可以這樣做:

from ruamel import yaml 

with open('reference_3d.yml') as fin: 
    rfr = yaml.round_trip_load(fin) 

print(rfr['temp']['data'][rfr['temp']['cols']-1]) 

得到最後第一個數據行的值(416.388153

如果你不能或者不願意改變你的C++程序,那麼只需使用ruamel.yaml和s kip YAML文件的第一行:

from ruamel import yaml 

with open('reference_3d.yml') as fin: 
    fin.readline() 
    rfr = yaml.round_trip_load(fin) 

print(rfr['temp']['data'][rfr['temp']['cols']-1])