【问题标题】:Loading document as raw string in yaml with PyYAML使用 PyYAML 在 yaml 中将文档作为原始字符串加载
【发布时间】:2011-10-12 13:46:51
【问题描述】:

我想解析如下的 yaml 文档

meta-info-1: val1
meta-info-2: val2

---

Plain text/markdown content!
jhaha

如果我使用 PyYAML load_all 这个,我会得到以下信息

>>> list(yaml.load_all(open('index.yml')))
[{'meta-info-1': 'val1', 'meta-info-2': 'val2'}, 'Plain text/markdown content! jhaha']

我在这里想要实现的是 yaml 文件应该包含两个文档,第二个应该被解释为单个字符串文档,更具体地说,任何带有 markdown 格式的大文本。我不希望它被解析为 YAML 语法。

在上面的示例中,PyYAML 将第二个文档作为单个字符串返回。但是,如果第二个文档有一个: 字符代替!,例如,我会收到语法错误。这是因为 PyYAML 正在解析该文档中的内容。

有没有办法告诉 PyYAML 第二个文档只是一个原始字符串而不是解析它?

编辑:那里有一些很好的答案。虽然使用引号或文字语法解决了上述问题,但我希望用户能够编写纯文本而无需任何额外的麻烦。只需三个-(或.)并写下一大段纯文本。其中也可能包括引号。所以,我想知道我是否可以告诉 PyYAML 只解析一个文档,然后将第二个文档直接提供给我。

Eidt 2:因此,适应 agf 的想法,而不是使用 try/except 作为第二个文档可能是有效的 yaml 语法,

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

感谢 agf。

【问题讨论】:

  • 您的文档不是有效的 YAML
  • 我知道。我不打算在第二个文档中编写有效的 yaml。我希望它读取为原始字符串内容,未解析为 yaml。

标签: python yaml pyyaml


【解决方案1】:

你可以的

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 字符。

因此,如果它不是双引号,听起来好像没有办法在解析中表示任意标量。

【讨论】:

  • 是的,我已经想到了这一点,但我的某些部分对这个看似 hacky 的解决方案并不满意 :)
  • pyyaml.org/wiki/PyYAMLDocumentation 可能有一个真正的解决方案,但快速扫描和搜索并没有发现它。
  • 是的,这几乎就是我最终要做的。有关我的确切解决方案,请参阅我在问题中的编辑。谢谢:)
【解决方案2】:

如果您只想在 YAML 中转义冒号字符,请将其括在 单引号或双引号中。此外,您可以尝试将 literal style 用于您的第二个文档,该文档应被视为单个标量。

【讨论】:

  • 嗨 Senthil,请查看我的更新。顺便说一句,我想我曾经在班加罗尔的 PyCon 上见过你。是你吗? ;)
  • 嗨 Shrikant,是的,就是我。 :) 很高兴在 SO 见到你。顺便说一句,回到你的问题,我会根据部分进行有条件的 YAML 加载,或者重载 YAML 加载类。第一个解决方案(有条件加载)似乎更容易。
  • 感觉一样:)。你能详细解释一下条件加载方法吗?我觉得我不太明白。
  • 与@agf 建议的非常相似。我只是赞成他的回答。 :)
  • 啊,谢谢。我也计划探索重载 YAML 方法,只是为了好玩:)
猜你喜欢
  • 2012-12-16
  • 1970-01-01
  • 2019-04-08
  • 2012-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-24
  • 1970-01-01
相关资源
最近更新 更多