Не похоже, что Python библиотека pyyaml
позволит мне прочитать многодокументный поток YAML и продолжить работу после точки ошибки синтаксического анализа. У меня есть два связанных вопроса:
- Я просто что-то упускаю, и какой-то другой API поддерживает это?
- Поддерживают ли парсеры на других языках программирования эту операцию? (если да, то какой)
Вот пример многодокументного потока YAML:
%YAML 1.1
---
# YAML can contain comments like this
name: David
age: 55
---
name: Mei
age: 50 # Including end-of-line
---
name: Juana: ERROR
age: 47
...
---
name: Adebayo
age: 58
...
Я бы хотел, чтобы код, подобный этому, пропустил плохой документ, но выяснить, "как бы ни был плох этот документ, после ...
и ---
начинается что-то новое.
with open('data/multidoc-bad.yaml') as stream:
docs = yaml.load_all(stream)
while True:
try:
doc = next(docs)
print(doc)
except StopIteration:
break
except Exception as err:
print(err)
Я бы хотел получить:
{'name': 'David', 'age': 55}
{'name': 'Mei', 'age': 50}
mapping values are not allowed here
in "data/multidoc-bad.yaml", line 10, column 12
{'name': 'Adebayo', 'age': 58}
Но на самом деле я не получаю эту последнюю строку для «Adebayo».
Я понимаю, что мог бы сам написать небольшой синтаксический анализатор, который читает строки и ищет только ...
и ---
строки для фрагментации потока. Затем передайте только отдельные документы в yaml.loads()
после моего собственного синтаксического анализа. Но похоже, что это то, что парсер должен делать для меня.