【问题标题】:Modifying YAML content修改 YAML 内容
【发布时间】:2020-08-26 16:36:39
【问题描述】:

我有一个如下所示的 YAML 文件。该文件包含一些特殊字符,如“---”,因此我无法使用yaml.load() 方法在 python 中加载 YAML。

_engine: E1
_parameter:
- capacity:
  - updated: 20200825
    dependent: []
---
_engine: E2
_parameter:
- capacity:
  - updated: 20200826
    dependent: [D1,D2]

YAML 内容为什么可以像下面的 python 一样更改。它将被封装在标签mainDatastage1stage2等下。每个“---”、stage<number value>的含义都会增加。

mainData:
stage1:
_engine: E1
_parameter:
- capacity:
  - updated: 20200825
    dependent: []
stage2:
_engine: E2
_parameter:
- capacity:
  - updated: 20200826
    dependent: [D1,D2]

最后,最终流也将是一个 YAML。

【问题讨论】:

  • 我猜你必须手动查找一行破折号并替换它。然后将结果解析为 yaml。你试过吗?发生了什么?或者您可以找出为什么必须首先处理损坏的 yaml 文件。
  • 三个连字符在 YAML 中标记一个新文档。见yaml.info/learn/document.html

标签: python yaml


【解决方案1】:

--- 是 YAML 语法的一部分。简而言之,它表示一个新文档的开始:https://yaml.org/spec/1.2/spec.html#YAML

从技术上讲,它实际上是“指令结束”行,但如果 YAML 文档不包含任何指令,那么它实际上与“开始一个新文档”相同。这允许将多个 YAML 文档连接在一起。使用 PyYAML,您可以使用 yaml.load_all 遍历文件中的所有文档。如果您想为每个文档关联一个“阶段”索引,只需执行以下操作:

for stage_num, stage in enumerate(yaml.load_all(fileobj)):
   ...

如果您想将其转换为单个文档,您可以执行类似的操作

stages = {} 
for n, stage in enumerate(yaml.load_all(fileobj)):
    stages[f'stage{n}'] = stage

然后将stages 转储到 YAML 文件中。

但我想明确一点,这些数据也已经有一个有效的结构,所以严格来说不需要修改它。

【讨论】:

  • 我使用的是 3.4.4 版本,并且在 stage[f'stage{n}'] = stage as Invalid syntax
  • Python 3.4 没有 f 字符串。
  • Python 3.4 在很长一段时间内也不再受支持。您应该至少更新到 python 3.6。
  • 我只是尝试使用 load_all 而不是 load 并尝试打印 yaml。而不是打印实际的“some_address>
  • 将o/p转换为list后即可使用。例如打印(列表(yaml.load_all(yaml_data)))
【解决方案2】:

应该这样做

import itertools

with open('/path/to/input.yml') as infile, open('/path/to/output.yml', 'w') as outfile:
    outfile.write("mainData:\n")
    stage = itertools.count(1)

    for line in infile:
        if not line.startswith('---'):
            outfile.write(line)
            continue
        outfile.write(f"stage{next(stage)}:\n")

【讨论】:

    猜你喜欢
    • 2017-11-09
    • 1970-01-01
    • 2010-12-09
    • 1970-01-01
    • 1970-01-01
    • 2015-12-21
    • 2018-07-05
    • 2020-12-08
    • 2010-10-26
    相关资源
    最近更新 更多