次のような yaml ドキュメントを解析したい
meta-info-1: val1
meta-info-2: val2
---
Plain text/markdown content!
jhaha
これload_all
を PyYAML で行うと、次のようになります
>>> list(yaml.load_all(open('index.yml')))
[{'meta-info-1': 'val1', 'meta-info-2': 'val2'}, 'Plain text/markdown content! jhaha']
ここで達成しようとしているのは、yaml ファイルに 2 つのドキュメントを含める必要があり、2 つ目のドキュメントは単一の文字列ドキュメント、より具体的にはマークダウン形式の大きなテキスト本体として解釈されることです。YAML 構文として解析されたくありません。
上記の例では、PyYAML は 2 番目のドキュメントを単一の文字列として返します。しかし、2 番目のドキュメントにたとえば:
の代わりに文字が含まれていると、構文エラーが発生します。!
これは、PyYAML がそのドキュメント内のものを解析しているためです。
2番目のドキュメントが生の文字列であり、解析しないことをPyYAMLに伝える方法はありますか?
編集:いくつかの優れた回答があります。引用符またはリテラル構文を使用すると上記の問題は解決しますが、ユーザーが余分な手間をかけずにプレーンテキストを記述できるようにしたいと思います。3 つ-
の 's (または.
's) だけで、大量のプレーン テキストを書き留めます。これには引用符も含まれる場合があります。ですから、PyYAML に 1 つのドキュメントのみを解析し、2 つ目のドキュメントを raw で渡すように指示できるかどうか知りたいです。
Eidt 2 : したがって、2 番目のドキュメントとして try/except を使用する代わりに、agf のアイデアを適用すると、有効な yaml 構文になる可能性があります。
config_content, body_content = open(filename).read().split('\n---')
config = yaml.loads(config_content)
body = yaml.loads(body_content)
ありがとうございます。