gpt4 book ai didi

python - 如何防止 ruamel 在值中间断行?

转载 作者:太空宇宙 更新时间:2023-11-03 21:23:27 27 4
gpt4 key购买 nike

我有两个问题!

  1. 有没有办法防止 round_trip_dump 甚至只是常规转储在句子中间断行?每当我的 YAML 文件中有一个长句子(即描述),并且我使用脚本来更改一些内容时,它就会断行并破坏我的文件。

  2. dump 和 round_trip_dump 有什么区别?

这是我的代码:

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

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

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

最佳答案

首先,您实际上无法获得所得到的输出。这实际上是无效的 YAML。文件中以空格开头的行和 how do I 将(必须)缩进多于关键描述。其次,如果不指定不同的缩进,则无法在 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

这在语义上与您的输入相同。最后(如何
do...
) 行是从以下位置开始的普通标量的延续行非常酷。加载时不会有换行符,只是 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)主要是前者了解往返装载机的所有特殊事项保存:

  • 风格
  • 评论
  • anchor /别名
  • 整数“样式”(八进制、二进制、十六进制、前导零)
  • float “样式”(科学记数法)
  • 可选:标量周围的引号
  • 转储从 YAML 加载的标记对象(无需注册特殊定义)

不安全/正常转储知道如何转储大多数 Python 对象,而如果您使用往返(或安全)自卸车。

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

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)

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

关于python - 如何防止 ruamel 在值中间断行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54037470/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com