【问题标题】:yaml parse in python: SyntaxError: invalid syntaxpython中的yaml解析:SyntaxError:无效语法
【发布时间】:2017-09-11 08:32:59
【问题描述】:

我想在 python 中解析一个 yaml 文件。我的 hosts.yaml 文件如下:

access:
  host: abc
    hostUrl: url-for-abc
    bearerToken: jjlhlj
    expires: someDate
  host: xyz
    hostUrl: url-for-xyz
    bearerToken: kdsddh
    expires: someDate

我解析yaml的python代码如下:

import yaml

def parse():
    with open('hosts.yaml', 'r') as hosts_file:
        hosts = yaml.load(hosts_file)
        for host, val in  hosts["access"]["host"]:
            print host
            print host["hostUrl"]
            print host["bearerToken"]

parse()

我收到以下错误:

python parse_yaml.py
Traceback (most recent call last):
  File "parse_yaml.py", line 19, in <module>
    parse()
  File "parse_yaml.py", line 13, in parse2
    hosts = yaml.safe_load(hosts_file)
  File "/usr/lib64/python2.7/site-packages/yaml/__init__.py", line 93, in safe_load
    return load(stream, SafeLoader)
  File "/usr/lib64/python2.7/site-packages/yaml/__init__.py", line 71, in load
    return loader.get_single_data()
  File "/usr/lib64/python2.7/site-packages/yaml/constructor.py", line 37, in get_single_data
    node = self.get_single_node()
  File "/usr/lib64/python2.7/site-packages/yaml/composer.py", line 36, in get_single_node
    document = self.compose_document()
  File "/usr/lib64/python2.7/site-packages/yaml/composer.py", line 55, in compose_document
    node = self.compose_node(None, None)
  File "/usr/lib64/python2.7/site-packages/yaml/composer.py", line 84, in compose_node
    node = self.compose_mapping_node(anchor)
  File "/usr/lib64/python2.7/site-packages/yaml/composer.py", line 133, in compose_mapping_node
    item_value = self.compose_node(node, item_key)
  File "/usr/lib64/python2.7/site-packages/yaml/composer.py", line 84, in compose_node
    node = self.compose_mapping_node(anchor)
  File "/usr/lib64/python2.7/site-packages/yaml/composer.py", line 127, in compose_mapping_node
    while not self.check_event(MappingEndEvent):
  File "/usr/lib64/python2.7/site-packages/yaml/parser.py", line 98, in check_event
    self.current_event = self.state()
  File "/usr/lib64/python2.7/site-packages/yaml/parser.py", line 428, in parse_block_mapping_key
    if self.check_token(KeyToken):
  File "/usr/lib64/python2.7/site-packages/yaml/scanner.py", line 116, in check_token
    self.fetch_more_tokens()
  File "/usr/lib64/python2.7/site-packages/yaml/scanner.py", line 220, in fetch_more_tokens
    return self.fetch_value()
  File "/usr/lib64/python2.7/site-packages/yaml/scanner.py", line 576, in fetch_value
    self.get_mark())
yaml.scanner.ScannerError: mapping values are not allowed here
  in "hosts.yaml", line 3, column 12

我无法理解,如果代码有问题的 yaml 文件结构有问题。 提前致谢。

【问题讨论】:

  • 你运行的代码和你显示的代码不一样。此外,ScannerError 不是 SyntaxError。
  • 是的...实际上代码中有一些官方值。我在这里复制时进行了编辑。
  • 绝对没有必要使用 PyYAML 的load(),它被证明是不安全的。

标签: python yaml


【解决方案1】:

您不能同时将字符串和对象作为键的值。你可以做字符串

access:
  host: abc
  host: xyz

或对象

access:
  host:
    hostUrl: url-for-abc
    bearerToken: jjlhlj
    expires: someDate
  host:
    hostUrl: url-for-xyz
    bearerToken: kdsddh
    expires: someDate

但不是两者都

access:
  host: abc
    hostUrl: url-for-abc
    bearerToken: jjlhlj
    expires: someDate
  host: xyz
    hostUrl: url-for-xyz
    bearerToken: kdsddh
    expires: someDate

我建议你把主机名放在对象中的name键中

access:
  host:
    name: abc
    hostUrl: url-for-abc
    bearerToken: jjlhlj
    expires: someDate
  host:
    name: xyz
    hostUrl: url-for-xyz
    bearerToken: kdsddh
    expires: someDate

【讨论】:

  • 谢谢。但是,如果两者都是主机,我如何遍历它以获取嵌套节点的值(名称、过期等)?
  • 这是一个完全不同的问题。
猜你喜欢
  • 2020-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-19
  • 2016-08-20
  • 2023-03-12
  • 1970-01-01
相关资源
最近更新 更多