python中的yaml解析:语法错误:无效语法

python中的yaml解析:语法错误:无效语法,python,yaml,Python,Yaml,我想用python解析yaml文件。My hosts.yaml文件如下所示: access: host: abc hostUrl: url-for-abc bearerToken: jjlhlj expires: someDate host: xyz hostUrl: url-for-xyz bearerToken: kdsddh expires: someDate import yaml def parse(): with o

我想用python解析yaml文件。My hosts.yaml文件如下所示:

access:
  host: abc
    hostUrl: url-for-abc
    bearerToken: jjlhlj
    expires: someDate
  host: xyz
    hostUrl: url-for-xyz
    bearerToken: kdsddh
    expires: someDate
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()
我解析yaml的python代码如下:

access:
  host: abc
    hostUrl: url-for-abc
    bearerToken: jjlhlj
    expires: someDate
  host: xyz
    hostUrl: url-for-xyz
    bearerToken: kdsddh
    expires: someDate
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
python解析_yaml.py
回溯(最近一次呼叫最后一次):
文件“parse_yaml.py”,第19行,在
parse()
parse2中第13行的文件“parse_yaml.py”
hosts=yaml.safe\u加载(hosts\u文件)
文件“/usr/lib64/python2.7/site packages/yaml/_init__.py”,第93行,安全加载
返回加载(流、安全加载程序)
文件“/usr/lib64/python2.7/site packages/yaml/_init__.py”,第71行,已加载
返回加载器。获取单个数据()
文件“/usr/lib64/python2.7/site packages/yaml/constructor.py”,第37行,在get_single_数据中
node=self.get\u single\u node()
文件“/usr/lib64/python2.7/site packages/yaml/composer.py”,第36行,在get_single_节点中
document=self.compose_document()
文件“/usr/lib64/python2.7/site packages/yaml/composer.py”,第55行,在compose_文档中
node=self.compose\u节点(无,无)
文件“/usr/lib64/python2.7/site packages/yaml/composer.py”,第84行,在compose_节点中
node=self.compose\u mapping\u节点(锚定)
文件“/usr/lib64/python2.7/site packages/yaml/composer.py”,第133行,在compose\u mapping\u节点中
item\u value=self.compose\u节点(节点,item\u键)
文件“/usr/lib64/python2.7/site packages/yaml/composer.py”,第84行,在compose_节点中
node=self.compose\u mapping\u节点(锚定)
文件“/usr/lib64/python2.7/site packages/yaml/composer.py”,第127行,在compose\u mapping\u节点中
而不是自我检查事件(MappingEndEvent):
文件“/usr/lib64/python2.7/site packages/yaml/parser.py”,第98行,在check_事件中
self.current_event=self.state()
文件“/usr/lib64/python2.7/site packages/yaml/parser.py”,第428行,在parse_block_mapping_键中
如果自校验令牌(KeyToken):
文件“/usr/lib64/python2.7/site packages/yaml/scanner.py”,第116行,在check_令牌中
self.fetch\u更多\u令牌()
文件“/usr/lib64/python2.7/site packages/yaml/scanner.py”,第220行,在fetch\u more\u令牌中
返回self.fetch_值()
文件“/usr/lib64/python2.7/site packages/yaml/scanner.py”,第576行,在fetch_值中
self.get_mark())
yaml.scanner.ScannerError:此处不允许映射值
在“hosts.yaml”第3行第12列中
我不能够理解,如果yaml文件结构有错误的话,代码会有一些问题。
提前感谢。

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

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

运行的代码与显示的代码不同。另外,ScannerError不是SyntaxError。是的……实际上代码中有一些官方值。我在这里复制时进行了编辑。完全不需要使用PyYAML的
load()
,这被证明是不安全的。谢谢。但是,如果两者都是主机,我如何迭代它以获得嵌套节点的值(名称、过期日期等)?这是一个完全不同的问题。