2017-09-11 1 views
-1

Je veux analyser un fichier yaml en python. Mon fichier hosts.yaml est comme ci-dessous:yaml parse en python: SyntaxError: syntaxe invalide

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

Mon code python pour analyser le YAML est comme ci-dessous:

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() 

Je reçois l'erreur suivante:

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 

Je suis pas en mesure de comprendre, si elle est incorrecte avec la structure du fichier yaml d'un problème avec le code. Merci d'avance.

+0

Le code que vous exécutez n'est pas le identique au code que vous avez affiché. En outre, ScannerError n'est pas une SyntaxError. –

+0

oui ... En fait, il y avait des valeurs officielles dans le code. J'ai édité en copiant ici. –

+0

Il n'est absolument pas nécessaire d'utiliser 'load()' de PyYAML, qui est documenté comme étant dangereux. – Anthon

Répondre

2

Vous ne pouvez pas avoir à la fois une chaîne et un objet en tant que valeur d'une clé. Vous pouvez faire des chaînes

access: 
    host: abc 
    host: xyz 

ou objets

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

mais pas les deux

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

Je vous suggère de mettre le nom de l'hôte dans une clé name dans l'objet

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

Merci. Mais, si les deux sont des hôtes, comment puis-je parcourir pour obtenir les valeurs des nœuds imbriqués (nom, expire, etc.)? –

+0

C'est une question complètement différente. –