Parsing 如何跳过YAML流中出现错误的文档?
Python库Parsing 如何跳过YAML流中出现错误的文档?,parsing,yaml,pyyaml,Parsing,Yaml,Pyyaml,Python库pyyaml似乎不允许我读取多文档YAML流并继续通过解析错误点。我有两个相关的问题: 我只是缺少了一些东西,而其他一些API将支持这一点吗 其他编程语言中的解析器是否支持此操作?(若有,详情为何) 以下是多文档YAML流的示例: %YAML 1.1 --- #YAML可以包含这样的注释 姓名:大卫 年龄:55 --- 姓名:梅 年龄:50#包括行尾 --- 姓名:胡安娜:错误 年龄:47 ... --- 姓名:阿德巴约 年龄:58 ... 我希望类似于此的代码可以跳过坏文档,但
pyyaml
似乎不允许我读取多文档YAML流并继续通过解析错误点。我有两个相关的问题:
%YAML 1.1
---
#YAML可以包含这样的注释
姓名:大卫
年龄:55
---
姓名:梅
年龄:50#包括行尾
---
姓名:胡安娜:错误
年龄:47
...
---
姓名:阿德巴约
年龄:58
...
我希望类似于此的代码可以跳过坏文档,但要弄清楚“无论此文档有多坏,在..
和--
之后都会有新的内容开始
以open('data/multidoc bad.yaml')作为流的:
docs=yaml.load\U all(流)
尽管如此:
尝试:
文档=下一个(文档)
打印(文档)
除停止迭代外:
打破
除异常作为错误外:
打印(错误)
我想得到:
{'name': 'David', 'age': 55}
{'name': 'Mei', 'age': 50}
mapping values are not allowed here
in "data/multidoc-bad.yaml", line 10, column 12
{'name': 'Adebayo', 'age': 58}
但事实上,我没有得到“阿德巴约”的最后一句话
我认识到我可以自己编写一个小型解析器,读取行,只查找..
和--
行来对流进行分块。然后在我自己的解析之后,只将单个文档传递给yaml.loads()
。但这似乎确实是解析器应该为我做的事情
我只是缺少了一些东西,而其他一些API将支持这一点吗
不,皮亚姆不能这样做
其他编程语言中的解析器是否支持此操作?(如果支持,请选择哪种)
据我所知没有。大多数YAML解析器都是手工编写的,其中相当一部分是PyYAML的翻译。我不知道有哪一个能够实现错误恢复。(我曾与SnakeYAML、go YAML、PyYAML、Libyml、YamlDotNet合作,并编写了Nimyml和AdaYaml。)
但这似乎确实是解析器应该为我做的事情
我认为解析器不支持这一点的原因包括
- 如果没有错误恢复,为YAML编写兼容解析器已经非常复杂
- 多文档功能很少使用,因此在增强它方面投入的精力很少
- 只有在这种情况下,才能明显地实现错误恢复;我认为在YAML文档中,几乎不可能实现有用的错误恢复,因此错误恢复不被视为一个明显的功能来实现
- 解决方法非常简单(您自己描述的)