我有两个问题!
是否有一种方法可以防止round_trip_dump或什至只是常规转储在句子中间打断一行?每当我的YAML文件中有很长的句子(即描述)并且使用脚本更改某些内容时,它都会中断一行并破坏我的文件。
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
答案 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()
函数是
rt
和unsafe
之间的差异(在很大程度上等于
round_trip_dump
和dump
)的区别主要在于前者
了解往返装载机的所有特殊情况
保留:
不安全/正常的转储知道如何转储大多数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)
它可能会起作用,但是输出是 “无法阅读”(评论将丢失)。另一种方式 可以,但是当然不推荐。