#python #yaml
#python #yaml
Вопрос:
Я писал модульный тест и обнаружил инструмент, который записывает конфигурацию YAML с отступом табуляции, но когда я попытался прочитать его с помощью yaml.load(file_object)
, я получаю сообщение об ошибке:
(<unknown>): found character that cannot start any token while scanning for the next token at line 2 column 1
или с помощью инструмента, который я вижу в терминале:
while scanning for the next token
found character 't' that cannot start any token
in "/user/config/settings", line 2, column 1
Комментарии:
1. Отступ табуляции в YAML запрещен (см. 6.1 Пробелы для отступов в спецификации: «Для обеспечения переносимости символы табуляции не должны использоваться в отступах, поскольку разные системы обрабатывают вкладки по-разному»). В чем именно заключается ваш вопрос?
2. ну, я прочитал документацию yaml, и в ней не было сказано, что она разрешает tab, однако я наткнулся на инструмент PyQt UI, который записывает файл yaml, предназначенный для tab, и мой код, пытающийся проверить конфигурацию пользователя, выдает ошибку выше. Вы ответили на мой вопрос, однако поддерживалось ли когда-либо наличие tab в некоторых старых версиях yaml?
3. Это удивительно, я бы сказал, что это ошибка в инструменте, о которой можно сообщить. Похоже, что отступ табуляции был запрещен со времен самой старой исторической версии спецификации . Стандартные библиотеки YAML делают это правильно, поэтому я полагаю, что это плохая пользовательская генерация YAML. Я думаю, что многие случаи (не уверен, что все) можно было бы «исправить», заменив начальные табуляции фиксированным количеством пробелов.
Ответ №1:
Хотя символы табуляции допустимы в YAML, они не могут использоваться для отступов ни в текущей версии (1.2, ни в более старой 1.1 или 1.0)
Это не означает, что табуляция не может появляться в начале строки, как показано в следующем примере
import sys
import ruamel.yaml
yaml_str = """
'xxx
tyyy'
"""
yaml = ruamel.yaml.YAML()
yaml.explicit_start = True
data = yaml.load(yaml_str)
print(data)
которая выполняется без ошибок и выдает:
xxx yyy
однако, если вы удалите одинарные кавычки из yaml_str
, вы
получите полученную ошибку (в строке 2, столбец 1), поскольку анализатор
необходимо учитывать, запускает ли yyy новый токен (при сканировании единственного
скалярный код в кавычках этого не делает).
Не видя фактического YAML, трудно сказать точно, но, вероятно, виноват ваш инструмент. Вам может сойти с рук замена табуляций:
with open('yourfile.yaml') as fp:
data = yaml.load(fp.read().replace('t', ' '))