代码之家  ›  专栏  ›  技术社区  ›  Edamame

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

  •  2
  • Edamame  · 技术社区  · 6 年前

    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
    

    但出现以下错误:

    Traceback (most recent call last):
      File "/Users/edamame/my_project/extract_appointments.py", line 16, in <module>
        db_cfg = yaml.safe_load(infile)
      File "/Users/edamame/my_project/venv/lib/python3.6/site-packages/yaml/__init__.py", line 94, in safe_load
        return load(stream, SafeLoader)
      File "/Users/edamame/my_project/venv/lib/python3.6/site-packages/yaml/__init__.py", line 72, in load
        return loader.get_single_data()
      File "/Users/edamame/my_project/venv/lib/python3.6/site-packages/yaml/constructor.py", line 35, in get_single_data
        node = self.get_single_node()
      File "/Users/edamame/my_project/venv/lib/python3.6/site-packages/yaml/composer.py", line 36, in get_single_node
        document = self.compose_document()
      File "/Users/edamame/my_project/venv/lib/python3.6/site-packages/yaml/composer.py", line 55, in compose_document
        node = self.compose_node(None, None)
      File "/Users/edamame/my_project/venv/lib/python3.6/site-packages/yaml/composer.py", line 84, in compose_node
        node = self.compose_mapping_node(anchor)
      File "/Users/edamame/my_project/venv/lib/python3.6/site-packages/yaml/composer.py", line 127, in compose_mapping_node
        while not self.check_event(MappingEndEvent):
      File "/Users/edamame/my_project/venv/lib/python3.6/site-packages/yaml/parser.py", line 98, in check_event
        self.current_event = self.state()
      File "/Users/edamame/my_project/venv/lib/python3.6/site-packages/yaml/parser.py", line 428, in parse_block_mapping_key
        if self.check_token(KeyToken):
      File "/Users/edamame/my_project/venv/lib/python3.6/site-packages/yaml/scanner.py", line 116, in check_token
        self.fetch_more_tokens()
      File "/Users/edamame/my_project/venv/lib/python3.6/site-packages/yaml/scanner.py", line 220, in fetch_more_tokens
        return self.fetch_value()
      File "/Users/edamame/my_project/venv/lib/python3.6/site-packages/yaml/scanner.py", line 576, in fetch_value
        self.get_mark())
    yaml.scanner.ScannerError: mapping values are not allowed here
      in "/Users/edamame/my_logins/my_config.yaml", line 5, column 9
    

    以下是我的安装: enter image description here 你知道我错过了什么吗?

    2 回复  |  直到 6 年前
        1
  •  2
  •   finefoot    6 年前

    here :

    你很可能有一些空格的差异,很可能在 port: 3306 线路。 请注意,因为PyYAML早于最新的YAML标准(2009年的1.2),所以 仍然考虑一些Unicode空白字符空白,尽管标准没有。

    • 尝试将文件复制并粘贴到联机解析器中,一次一行,直到出现错误。 这给你一个明确的指示哪条线错了。
    • 使用YAML转储程序从Python中构造的数据转储所需的数据结构

    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应该能够读取的文件。

        2
  •  1
  •   chris.mclennon    6 年前

    我无法在运行python2和python3以及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'}}
    

    您是否使用与示例相同的精确输入来获取此错误?