Pyyamlを使用したyamlの生文字列としてドキュメントを読み込みます

StackOverflow https://stackoverflow.com/questions/6816236

  •  25-10-2019
  •  | 
  •  

質問

次のような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番目のドキュメントは単一の文字列ドキュメント、より具体的にはMarkdownフォーマットを備えたテキストの大きな本文として解釈されることになっています。 YAML構文として解析されたくありません。

上記の例では、Pyyamlは2番目の文書を単一の文字列として返します。ただし、2番目のドキュメントにがあります : の代わりにキャラクター ! たとえば、構文エラーが発生します。これは、Pyyamlがそのドキュメントのものを解析しているためです。

Pyyamlに、2番目のドキュメントは単なる生の文字列であり、それを解析しないことを伝える方法はありますか?

編集: :そこにはいくつかの優れた答えがあります。引用符または文字通りの構文を使用している間、上記の問題を解決しますが、ユーザーに余分なクルフトなしでプレーンテキストを書くことができるようにしたいと思います。 3つだけ -'s(または .'s)そして、プレーンテキストの大きな体を書き留めてください。また、引用も含まれる場合があります。だから、Pyyamlに1つのドキュメントのみを解析し、2番目のドキュメントをRawに与えるように伝えることができるかどうかを知りたいです。

EIDT 2: :したがって、2番目のドキュメントが有効なYAML構文である可能性がある場合を除き、AGFのアイデアを使用する代わりに、AGFのアイデアを適応させます。

config_content, body_content = open(filename).read().split('\n---')
config = yaml.loads(config_content)
body = yaml.loads(body_content)

AGFに感謝します。

役に立ちましたか?

解決

できるよ

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ドキュメントから、

Double-quotedは最も強力なスタイルであり、 あらゆるスカラー値を表現できるスタイルのみ. 。二重引用されたスカラーは逃げることができます。脱出シーケンス x **および u ****を使用して、ASCIIまたはUnicode文字を表現できます。

したがって、二重引用されていない場合、解析に任意のスカラーを表す方法はないようです。

他のヒント

あなたが望むのがヤムルのコロンキャラクターから逃げることだけである場合、それを囲みます 単一または二重引用符. 。また、試すこともできます リテラルスタイル 単一のスカラーとして扱う必要がある2番目のドキュメントの場合。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top