在python中读取YAML文件时出错

在python中读取YAML文件时出错,python,opencv,yaml,pyyaml,Python,Opencv,Yaml,Pyyaml,我有一个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

我有一个
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矩阵
,我在
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
 ^
回溯(最近一次呼叫最后一次):
文件“scatter_plot.py”,第15行,在
rfr=yaml.load(fin.read())
文件“/usr/local/lib/python2.7/site packages/yaml/_init__.py”,第71行,已加载
返回加载器。获取单个数据()
文件“/usr/local/lib/python2.7/site packages/yaml/constructor.py”,第37行,在get\u single\u数据中
node=self.get\u single\u node()
文件“/usr/local/lib/python2.7/site packages/yaml/composer.py”,第35行,在get_single_节点中
如果不是自检查事件(StreamEndEvent):
文件“/usr/local/lib/python2.7/site packages/yaml/parser.py”,第98行,在check_事件中
self.current_event=self.state()
文件“/usr/local/lib/python2.7/site packages/yaml/parser.py”,第157行,在parse\u implicit\u document\u start中
返回self.parse_document_start()
文件“/usr/local/lib/python2.7/site packages/yaml/parser.py”,第174行,在parse_document_start中
self.peek_标记().start_标记)
yaml.parser.ParserError:应为“”,但找到“”
在“”第2行第2列中:
温度:!!opencv矩阵
^

请问我该如何解决这个错误?

< P>这里的问题是,C++生成(无效)YAML 1,并试图用Python解析器解析它,它可以处理大部分的YAML 1.1。 没有太多的例子,但是文档指令规定可选的应该在文档开始()和规范之后的文档标题中。因此,正确的YAML 1.0文档应从以下内容开始:

---
%YAML:1.0
然而,即使输出正确,PyYAML也无法读取这个较旧的YAML版本文件

<>因为最近的YAML规范(1.2)是2009,最好的办法是将C++程序和Python程序切换到1.2兼容的库库。对于C++,这将是,对于Python,这是必须的(免责声明:我是那个包的作者)。 YAML文件看起来像(
YAML cpp
可能会更改标记,甚至可能更改转储的其余部分):

你可以这样做:

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++程序,那么只需使用<代码> RuMel.YAML< /Cord>,跳过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])

@karthikr请注意结尾问题重复。您指出的问题中的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])