使用Python读取YAML文件会导致yaml.scanner.ScannerError:此处不允许映射值

时间:2018-09-19 21:49:14

标签: python yaml pyyaml

我正在使用以下代码:

var mObject: MObject = mObjectUndecided?.let{ mObject1 ->
    // Do Something
    mObject1.mObjectNext?.let { mObject2 ->
        // Do Something
        mObject2.mObjectNext?.let { mObject3 ->
            // Do Something
        }
        // Do Something
    }
    // Do Something
    it // return it if its not null
} ?: run {
    MObject().also {
        // Do Something
    }
}

尝试读取import yaml with open('/Users/edamame/my_logins/my_config.yaml', 'r') as infile: db_cfg = yaml.safe_load(infile)

my_config.yaml

但出现以下错误:

database_info:
    username: edamame
    password: mypassword
    host: 1.2.3.4
    port: 3306
    database: mydb

这是我的装置: enter image description here 知道我在这里错过了什么吗?

2 个答案:

答案 0 :(得分:2)

您显示的输入不会产生该错误。您可以尝试here

您很可能会有一些空格差异,最有可能在port: 3306行中。 请注意,由于PyYAML早于最新的YAML标准(2009年为1.2),因此 尽管标准没有考虑,但仍将某些Unicode空格字符视为空格。

如果通过查看文件找不到导致此问题的原因,则有两个可能的选择:

  • 尝试一次将文件复制并粘贴到在线解析器中一行,直到弹出错误为止。 这样可以清楚地表明哪条线是错误的。
  • 使用YAML转储器从Python构造的数据中转储所需的数据结构

后者在PyYAML中不容易完成,因为它将在写入时对映射的键进行排序。

import sys
import ruamel.yaml
from ruamel.yaml.comments import CommentedMap as cm

data = cm()
data['database_info'] = d = cm()
d['username'] = 'edamame'
d['password'] = 'mypassword'
d['host'] = '1.2.3.4'
d['port'] = 3306
d['database'] = 'mydb'


yaml = ruamel.yaml.YAML()
yaml.indent(mapping=4)

with open('my_config.yaml', 'w') as ofp:
    yaml.dump(data, ofp)

它将在my_config.yaml中生成以下内容:

database_info:
    username: edamame
    password: mypassword
    host: 1.2.3.4
    port: 3306
    database: mydb

PyYAML甚至应能够读取的文件。

答案 1 :(得分:1)

在运行Python 2和3且PyYAML == 3.13的虚拟环境中,我无法使用几乎相同的代码进行复制。

>>> import yaml
>>> with open('sample.yaml', 'r') as infile:
...   db_cfg = yaml.safe_load(infile)
... 
>>> db_cfg
{'database_info': {'username': 'edamame', 'password': 'mypassword', 'host': '1.2.3.4', 'port': 3306, 'database': 'mydb'}}

您是否使用与示例相同的确切输入来得到此错误?

否则,请确保您输入的格式正确。每个冒号后面是否有空格?事情缩进正确吗?