缺少使用python转储的YAML语法

时间:2017-01-17 11:53:22

标签: python yaml

我正在python中读取一个这样的yaml文件:

- test:
    name: test1
    param:
      p1: v1
      p2: v2

首先我解析文件,然后对它应用一些更改,最后我将其转储到多个文件中。

def read_test():
     with open('file.yaml', "r") as stream:
        test = yaml.load(stream)



def write_test(config):
     with open('test.yaml', 'w') as outfile:
        yaml.dump(config, outfile, default_flow_style=False)

这是我得到的输出:

test:
  name: test1
  param:
    p1: localhost:3000
    p2: ../test/run.sh

但我希望如此:

- test:
    name: test1
    param:
      p1: localhost:3000
      p2: ../test/run.sh

更新

这是我应用更改的方式:

def split_test():
  try:
    tests = read_test()
    for config in tests:          
      write_test(config)
  except yaml.YAMLError as out:
    print(out)

此函数更改最终输出的语法。有什么帮助吗?

1 个答案:

答案 0 :(得分:1)

此处没有错误,您的代码的行为与您告诉它的方式完全相同。

tests = read_test()

好的,您阅读原始文件并将结果存储在tests

for config in tests:

现在,您将遍历原始文件的内容。这是一个YAML序列,因此可以迭代它。

  write_test(config)

这里有一些评论:

  • 将对输入YAML的每个配置项执行
  • 由于write_test始终写入相同的文件,因此会为每个配置项反复覆盖test.yaml
  • 由于config仅包含列表项的值,当然,因此列表本身不是写入的YAML的一部分。

要获得所需的输出,只需将这两行替换为:

for config in tests:          
  write_test(config)

使用:

write_test(tests)

注意:根据您的功能命名,您希望将文件拆分为多个文件。但是,在问题的描述中,您描述了您只想加载它,修改它然后再次转储它。你应该更清楚地描述你想做什么。