如何防止ruamel在值中间断线?

时间:2019-01-04 10:49:36

标签: python yaml ruamel.yaml

我有两个问题!

  1. 是否有一种方法可以防止round_trip_dump或什至只是常规转储在句子中间打断一行?每当我的YAML文件中有很长的句子(即描述)并且使用脚本更改某些内容时,它都会中断一行并破坏我的文件。

  2. dump和round_trip_dump有什么区别?

这是我的代码:

from itertools import groupby
[v for k, g in groupby(lst) for v in [k] + [""] * (len(list(g))-1)]
# [1, '', '', 2, '', '', '', 3, '', '', '', '', 4, '', '', '', '', '', '', '', '']

这是我当前的文件:

import ruamel.yaml

yml = "test.yml"

data = ruamel.yaml.round_trip_load(open(yml, "r"), preserve_quotes=True)
ruamel.yaml.round_trip_dump(data, open(yml, "w"))

我只想简单地加载和转储它(并修复缩进,但是在这种情况下,它已经修复了)。所以,当我运行我的代码时,我得到了:

person_1:
  name: Michael
  age: 20
  description: A very cool person with some really cool text, to show this issue, how do I fix this, it's going to break a line in a few words

1 个答案:

答案 0 :(得分:0)

首先,您实际上无法获得所获得的输出。那实际上是无效的YAML。 文件中以空格和how do I开始的行的缩进量必须大于 键description。 其次,如果不指定其他缩进,则无法在ruamel.yaml中获得三个空格的缩进。

因此输出不是来自您提供的程序,或者是您发生了格式错误。

您得到的输出是:

person_1:
  name: Michael
  age: 20
  description: A very cool person with some really cool text, to show this issue,
    how do I fix this, it's going to break a line in a few words

,这在语义上与您的输入相同。最后(how do...)行是从以下开始的普通标量的延续行 A very cool。加载时将没有换行符,只有issue,how之间的空格。

您得到续行是因为您的内容更广泛 比默认输出宽度大,因此最简单的方法是从 默认的“最佳宽度”为80。

我也建议您使用新的API(已经过时了),并遵循 文件扩展名.yaml(自2006年9月以来,这是推荐的扩展名)。

import sys
import ruamel.yaml

yaml_file = "test.yaml"

yaml = ruamel.yaml.YAML()
yaml.indent(mapping=3, sequence=2, offset=0)  # sequence and offset have their default values here
yaml.preserve_quotes = True
yaml.width = 800    # this is the output line width after which wrapping occurs
with open(yaml_file) as fp:
    data = yaml.load(fp)
with open(yaml_file, 'w') as fp:
    yaml.dump(data, fp)

之后,输出文件看起来像原始文件,但缩进了三个位置:

person_1:
   name: Michael
   age: 20
   description: A very cool person with some really cool text, to show this issue, how do I fix this, it's going to break a line in a few words

如果需要,新API中的默认值为往返(即YAML(typ='rt')) 的旧功能dump()(没有Dumper参数),您应该 使用yaml = YAML(typ='unsafe')。倾销本身并非不安全,但 等效的旧样式load()函数是

rtunsafe之间的差异(在很大程度上等于 round_trip_dumpdump)的区别主要在于前者 了解往返装载机的所有特殊情况 保留:

  • 样式
  • 评论
  • 锚定/别名
  • 整数“样式”(八进制,二进制,十六进制,前导零)
  • 浮动“样式”(科学记号)
  • 可选:标量周围的引号
  • 转储从YAML加载的标记对象(没有注册特殊定义)

不安全/正常的转储知道如何转储大多数Python对象,而 如果您使用往返行程,则必须注册特殊的自卸车(或 safe)自卸车。

您不应尝试使用不安全的转储程序转储所加载的内容 与往返装载机。

yaml_i = ruamel.yaml.YAML()
yaml_o = ruamel.yaml.YAML(typ='unsafe')
with open(yaml_file) as fp:
    data = yaml_i.load(fp)
with open(yaml_file, 'w') as fp:
    yaml_o.dump(data, fp)

它可能会起作用,但是输出是 “无法阅读”(评论将丢失)。另一种方式 可以,但是当然不推荐。