如何跳过 YAML 流中有错误的文档?

大卫·默茨

Python 库似乎pyyaml不允许我读取多文档 YAML 流并继续超过解析错误点。我有两个相关的问题:

  1. 我是否只是遗漏了一些东西,而其他一些 API 会支持这一点?
  2. 其他编程语言的解析器是否支持这种操作?(如果是,是哪个)

以下是多文档 YAML 流的示例:

%YAML 1.1
---
# YAML can contain comments like this
name: David
age: 55
---
name: Mei
age: 50     # Including end-of-line
---
name: Juana: ERROR
age: 47
...
---
name: Adebayo
age: 58
...

我希望与此类似的代码跳过错误的文档,但要弄清楚“无论这个文档有多糟糕,在...之后都会有新的东西开始---

with open('data/multidoc-bad.yaml') as stream:
    docs = yaml.load_all(stream)
    while True:
        try:
            doc = next(docs)
            print(doc)
        except StopIteration:
            break
        except Exception as err:
            print(err)

我想得到:

{'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 会支持这一点?

不,PyYAML 不能这样做。

其他编程语言的解析器是否支持这种操作?(如果是,是哪个)

我所知道的都没有。大多数 YAML 解析器都是手写的,其中相当一部分是从 PyYAML 翻译而来的。我不知道一个实现错误恢复的。(我使用过 SnakeYAML、go-yaml、PyYAML、libyaml、YamlDotNet,并编写了 NimYAML 和 AdaYaml。)

但看起来这确实是解析器应该为我做的事情。

我认为解析器不支持的原因包括

  • 为 YAML 编写兼容的解析器已经非常复杂了,没有错误恢复,
  • 多文档功能很少使用,因此很少努力增强它,
  • 这是唯一一种很明显如何实现错误恢复的情况;我认为在 YAML 文档中,几乎不可能实现有用的错误恢复,因此错误恢复不被视为要实现的明显特征,
  • 解决方法非常简单(您自己描述过)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

当我使用 ConcurrentMessageListenerContainer 时,如何跳过在 kafka 中有错误的味精?

跳过或忽略与杰克逊YAML解析错误

在python中读取Yaml文件时如何跳过行?

如何仅向前跳过流?

如何解析具有多个文档的YAML文件?

GitHub Actions-您的Yaml语法有错误

如何跳过Java流中的连续元素?

如何在mongodb中跳过文档

如何使用猫鼬跳过文档?

如何解决“ RenderFlex在右边溢出。” 行中有错误?

如果命令中有错误,如何制作批处理文件报告

discord.py 在我的不和谐机器人中有错误如何修复?

如何使用 case_when 而不是 if_else [我的代码中有错误?]

如果变量不等于 azure 管道 yaml 中的预期值,如何跳过模板?

如何在发布管道中停用/跳过阶段(非YAML)但其传递(后续阶段继续)

如何使用ruamel.yaml来正确设置YAML流样式转储?

如何使用 jacksoon-dataformat-yaml 高效管理 Java 中的 YAML 文档?

如何跳过导致锈蚀执行的错误?

如何执行SQL查询跳过错误?

如何自动输入错误值而不是跳过?

如何跳过熊猫中的关键错误?

如何跳过Julia循环中的错误

如何跳过返回错误消息的迭代

如何跳过Rails中的所有验证?

如何从setUpClass跳过所有测试

如何跳过没有内容的值?

如何在Gulp流中将YAML传递到EJS?

如何在cloudformation策略文档中引用资源ARN?(yaml)

如何正确记录swagger / yaml文档上的text / csv响应?