2017-09-11 16 views
-1

Pythonでyamlファイルを解析したい。マイhosts.yamlファイルは以下の通りです:YAMLを解析するPythonでyamlを解析する:SyntaxError:無効な構文

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

私のPythonコードは以下の通りです:

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 

私は:私は以下のエラーを取得しています

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ファイル構造で間違っている場合、理解することができません。 ありがとうございます。

+0

実行するコードはあなたが表示したコードと同じです。また、ScannerErrorはSyntaxErrorではありません。 –

+0

はい...実際にコードに公式な値がありました。私はここでコピー中に編集しました。 –

+0

安全でないことが記録されているPyYAMLの 'load()'は絶対に使用する必要はありません。 – Anthon

答えて

2

文字列とオブジェクトの両方をキーの値として使用することはできません。あなたはどちらかを行うことができ、文字列

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 
+0

ありがとうございます。しかし、両方がホストの場合、ネストされたノード(名前、期限切れなど)の値を取得するために、それをどのように反復することができますか? –

+0

それはまったく異なる質問です。 –

関連する問題