12

次のような 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)

ありがとうございます。

4

2 に答える 2

6

できるよ

raw = open(filename).read()
docs = []
for raw_doc in raw.split('\n---'):
    try:
        docs.append(yaml.load(raw_doc))
    except SyntaxError:
        docs.append(raw_doc)

元のドキュメントの形式を制御できない場合。

PyYAML ドキュメントから、

二重引用符は最も強力なスタイルであり、任意のスカラー値を表現できる唯一のスタイルです。二重引用符で囲まれたスカラーはエスケープできます。エスケープ シーケンス \x** および \u**** を使用すると、任意の ASCII または Unicode 文字を表現できます。

そのため、二重引用符で囲まれていない場合、解析で任意のスカラーを表す方法がないように思えます。

于 2011-07-25T12:55:55.073 に答える
2

YAML でコロン文字をエスケープすることだけが必要な場合は、一重引用符または二重引用符で囲みます。また、単一のスカラーとして扱う必要がある 2 番目のドキュメントのリテラル スタイルを試すこともできます。

于 2011-07-25T12:49:28.907 に答える