Python 为什么我不能解析我的简单YAML文件而不产生错误;此处不允许使用映射值";?

Python 为什么我不能解析我的简单YAML文件而不产生错误;此处不允许使用映射值";?,python,parsing,yaml,Python,Parsing,Yaml,我试图打开、解析YAML文件,然后将其传递到Python脚本中的dict中。然而,我似乎无法在一个简单的文本编辑器中格式化文件本身,从而允许对其进行解析。我不断得到错误此处不允许映射值位于YAML文本文件中的同一位置。我试着用不同的方式重新格式化它,但是我在同一个地方不断得到相同的错误。我的代码设置如下: from __future__ import print_function import ruamel.yaml as ry with open("yamltest2.yaml", 'r')

我试图打开、解析YAML文件,然后将其传递到Python脚本中的dict中。然而,我似乎无法在一个简单的文本编辑器中格式化文件本身,从而允许对其进行解析。我不断得到错误
此处不允许映射值
位于YAML文本文件中的同一位置。我试着用不同的方式重新格式化它,但是我在同一个地方不断得到相同的错误。我的代码设置如下:

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通知我错误的来源总是出现在带有
名称:
的行的末尾):


有谁能帮我确定这个错误的根本原因吗?

您在
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

您在
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

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

mapping values are not allowed here
  in "yamltest2.yaml", line 2, column 5
这是因为您使用跨越多(两)行的标量“input=”“”\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
,而不是您期望的dict

但是,您的代码还有另一个问题需要解决:您不应该使用标准的
load()
。当您使用
load()
时,我在
ruamel.yaml
中提出警告是有原因的,因为使用
load()
是危险的。您可以通过
load>消除警告(stream,Loader=ruamel.yaml.Loader)
按您的操作,或使用以下命令抑制警告:

import warnings
warnings.simplefilter('ignore', ruamel.yaml.error.UnsafeLoaderWarning)
但我在这里重复我在警告消息
ruamel.yaml
中建议的内容,当调用未加修饰时:使用
safe\u load()
您没有理由不这样做:

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)

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

mapping values are not allowed here
  in "yamltest2.yaml", line 2, column 5
这是因为您使用跨越多(两)行的标量“input=”“”\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
,而不是您期望的dict

但是,您的代码还有另一个问题需要解决:您不应该使用标准的
load()
。当您使用
load()
时,我在
ruamel.yaml
中提出警告是有原因的,因为使用
load()
是危险的。您可以通过
load>消除警告(stream,Loader=ruamel.yaml.Loader)
按您的操作,或使用以下命令抑制警告:

import warnings
warnings.simplefilter('ignore', ruamel.yaml.error.UnsafeLoaderWarning)
但我在这里重复我在警告消息
ruamel.yaml
中建议的内容,当调用未加修饰时:使用
safe\u load()
您没有理由不这样做:

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)