【问题标题】:Using a configuration of YAML which is tab indented使用制表符缩进的 YAML 配置
【发布时间】:2019-03-14 11:10:54
【问题描述】:

我正在编写一个单元测试,我发现了一个使用制表符缩进编写 YAML 配置的工具,但是当我尝试使用 yaml.load(file_object) 读取它时,我收到一条错误消息:

(<unknown>): found character that cannot start any token while scanning for the next token at line 2 column 1

或使用我在终端中看到的工具:

while scanning for the next token
found character '\t' that cannot start any token
  in "/user/config/settings", line 2, column 1

【问题讨论】:

  • YAML 中不允许制表符缩进(参见规范中的6.1 Indentation Spaces:“为了保持可移植性,制表符不能用于缩进,因为不同的系统对制表符的处理方式不同”)。你的问题到底是什么?
  • 好吧,我通读了 yaml 的文档,并没有说它允许选项卡,但是我遇到了一个 PyQT UI 工具,它正在编写 yaml 文件选项卡,我的代码试图检查用户配置得到错误以上。您已经回答了我的问题,但是在某些旧的 yaml 版本中是否支持过选项卡?
  • 这很令人惊讶,我会说这是工具中的错误,可以报告。似乎标签缩进已被禁止since the oldest historical version of the specification。标准 YAML 库正确地做到了这一点,所以我认为这是一个糟糕的自定义 YAML 生成。我认为许多情况(不确定是否全部)可以通过用固定数量的空格替换初始选项卡来“修复”。

标签: python yaml


【解决方案1】:

虽然制表符在 YAML 中有效,但不能在 YAML 中使用 缩进,在当前版本中都没有 (1.2,也不在 较旧的1.1,或 1.0)

暗示不能在行首出现制表符,如下所示 示例展示

import sys
import ruamel.yaml

yaml_str = """\
'xxx
\tyyy'
"""

yaml = ruamel.yaml.YAML()
yaml.explicit_start = True
data = yaml.load(yaml_str)
print(data)

运行没有错误并给出:

xxx yyy

如果您从 yaml_str 中删除单引号,您将 得到你得到的错误(在第 2 行,第 1 列),因为解析器 必须考虑 yyy 是否开始一个新的令牌(同时扫描单 引用的标量它不这样做)。

没有看到实际的 YAML,很难下定论,但是 很可能你的工具是罪魁祸首。你可能会逃脱更换 标签:

with open('yourfile.yaml') as fp:
    data = yaml.load(fp.read().replace('\t', ' '))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-27
    • 1970-01-01
    • 1970-01-01
    • 2015-07-30
    • 2011-10-02
    • 2016-09-09
    相关资源
    最近更新 更多