为什么我不能解析我的简单YAML文件而不会产生错误“这里不允许映射值”?

时间:2017-05-27 11:55:37

标签: python parsing yaml

我正在尝试打开,解析,然后将我的YAML文件传递到我的Python脚本中的dict中。但是,我似乎无法在一个允许它解析的简单文本编辑器中格式化文件本身。我一直在YAML文本文件中的同一位置收到错误mapping values are not allowed here。我试图以各种方式重新格式化它,但我在同一个地方继续得到同样的错误。我的代码设置如下:

from __future__ import print_function
import ruamel.yaml as ry

with open("yamltest2.yaml", 'r') as stream:
    try:
        print(ry.load(stream, Loader= ry.Loader))
    except ry.YAMLError as exc:
        print(exc)

我的YAML文本文件本身就是这样设置的(注意:我的IDE告诉我错误的源始终出现在name:行的末尾):

input = """\
name: 
    a: 1 # comment
    b: 2
    c: 3
    d: 4
"""

有人可以帮我确定导致此错误的根本原因吗?

2 个答案:

答案 0 :(得分:2)

您正在yamltest2.yaml混合使用Python和YAML。而不是

input = """\
name: 
    a: 1 # comment
    b: 2
    c: 3
    d: 4
"""

您的.yaml文件应如下所示:

name: 
    a: 1 # comment
    b: 2
    c: 3
    d: 4

答案 1 :(得分:0)

您的IDE可能正在解析您收到的完整错误,ruamel.yaml错误以及文件出错的确切位置:

mapping values are not allowed here
  in "yamltest2.yaml", line 2, column 5

这是因为您使用标量'输入=""" \ name'来启动YAML文件。 (\这里是不是一个转义反斜杠),它跨越多条(两条)行,但随后将该标量用作映射中的一个键。在YAML中不允许这样做。

如果你想要一把钥匙,你可以指定:

input = """\ name:
    a: 1 # comment
    b: 2
    c: 3
    d: 4

你必须从文件中删除尾随""",因为这是一个没有值的不完整密钥,会引发另一个错误。

但这不是你想要的,你可能试图从以下程序中外包嵌入的YAML字符串:

from __future__ import print_function
import ruamel.yaml as ry

input = """\
name: 
    a: 1 # comment
    b: 2
    c: 3
    d: 4
"""

try:
    print(ry.load(input, Loader= ry.Loader))
except ry.YAMLError as exc:
    print(exc)

并在编辑副本时将所有已删除的行粘贴到您的YAML中。正如@errata已经指出的那样,那不是YAML。如果你不能自己立即解决这些问题,你当然可以在[so]上问这个问题,但是一个经常帮助查明错误的技巧是从错误点开始删除所有内容并检查哪些数据当截断的YAML加载没有问题时加载。在您的情况下,您的YAML需要被截断为:

input = """\
name

加载为字符串input = """\ name而不是您预期的字典。

但是,您应该解决您的代码的另一个问题:您不应该使用标准load()。当您ruamel.yaml使用load()时,我会在load()中发出警告,因为使用load(stream, Loader=ruamel.yaml.Loader)是危险的。你可以像你一样摆脱import warnings warnings.simplefilter('ignore', ruamel.yaml.error.UnsafeLoaderWarning) 的警告,或者用以下方法取消警告:

ruamel.yaml

但是我在这里重复我在警告信息safe_load()给出的内容,在调用unadorned时使用from __future__ import print_function import ruamel.yaml as ry with open("yamltest2.yaml", 'r') as stream: try: print(ry.safe_load(stream)) except ry.YAMLError as exc: print(exc) 您没有理由不这样做

WorksheetFunction.VAR_S