Чтение YAML-файла с Python приводит к yaml.scanner.ScannerError: здесь не разрешены значения отображения - PullRequest
0 голосов
/ 20 сентября 2018

Я использую следующий код:

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 ]

0 голосов
/ 20 сентября 2018

Вводимые вами данные не генерируют эту ошибку.Вы можете попробовать это здесь :

Скорее всего, у вас есть некоторые пробельные различия, скорее всего, в строке port: 3306.Обратите внимание, что поскольку PyYAML предшествует последнему стандарту YAML (1.2 из 2009), он по-прежнему учитывает некоторые пробельные символы Юникода, хотя стандарт этого не делает.

Если вы не можете найти причины этого, посмотрев наfile, это два возможных варианта:

  • Попробуйте скопировать и вставить файл в онлайн-анализатор по одной строке за раз, пока не появится сообщение об ошибке.Это дает вам четкое представление о том, какая строка неправильная.
  • Извлеките необходимую структуру данных, используя дампер YAML, из данных, созданных в Python

Последнее не может быть легко выполнено в PyYAML, так как оно будет сортировать ключи отображения при записи.

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 должен уметь читать.

0 голосов
/ 20 сентября 2018

Я не могу выполнить репликацию с использованием практически идентичного кода в виртуальных средах, работающих как на Python 2, так и на 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'}}

Получаете ли вы эту ошибку, используя тот же самый точный ввод, что ипример?

В противном случае, убедитесь, что ваши входы правильно отформатированы.Есть ли пробел после каждого двоеточия?Вещи правильно отступают?

...