python – 将YAML多行值转换为折叠块标量样式?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 将YAML多行值转换为折叠块标量样式?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3094字,纯文字阅读大概需要5分钟。
内容图文
![python – 将YAML多行值转换为折叠块标量样式?](/upload/InfoBanner/zyjiaocheng/781/64eaae4fb46940fbb542daefd2255988.jpg)
使用ruamel.yaml我尝试以某种样式获得YAML,更具体地说,单行字符串从同一行开始:和使用折叠标量样式(| / | – )的多行字符串和限制为某一行的行字符数量(包装字).
到目前为止,我的尝试受到similar function called walk_tree in the sources的影响很大:
#!/usr/bin/env python
import ruamel.yaml
from ruamel.yaml.scalarstring import ScalarString, PreservedScalarString
def walk_tree(base):
from ruamel.yaml.compat import string_types
if isinstance(base, dict):
for k in base:
v = base[k]
if isinstance(v, string_types):
v = v.replace('\r\n', '\n').replace('\r', '\n').strip()
base[k] = ScalarString(v) if '\n' in v else v
else:
walk_tree(v)
elif isinstance(base, list):
for idx, elem in enumerate(base):
if isinstance(elem, string_types) and '\n' in elem:
print(elem) # @Anthon: this print is in the original code as well
base[idx] = preserve_literal(elem)
else:
walk_tree(elem)
with open("input.yaml", "r") as fi:
inp = fi.read()
loader=ruamel.yaml.RoundTripLoader
data = ruamel.yaml.load(inp, loader)
walk_tree(data)
dumper = ruamel.yaml.RoundTripDumper
with open("output.yaml", "w") as fo:
ruamel.yaml.dump(data, fo, Dumper=dumper, allow_unicode=True)
但后来我得到一个例外:ruamel.yaml.representer.RepresenterError:无法表示一个对象:….如果我将ScalarString替换为PreservedScalarString,就像原始的walk_tree代码中的情况一样,我没有例外但是我再次得到了文字块,这不是我想要的.
那么我的代码如何修复以便它可以工作呢?
解决方法:
ScalarString类是LiteralScalarString的基类,它没有你发现的代表.你应该只使用/保持这个Python字符串,因为它适当地处理特殊字符(引用需要引用的字符串以符合YAML规范).
假设你有这样的输入:
- 1
- abc: |
this is a short string scalar with a newline
in it
- "there are also a multiline\nsequence element\nin this file\nand it is longer"
你可能想做类似的事情:
import ruamel.yaml
from ruamel.yaml.scalarstring import LiteralScalarString, preserve_literal
def walk_tree(base):
from ruamel.yaml.compat import string_types
def test_wrap(v):
v = v.replace('\r\n', '\n').replace('\r', '\n').strip()
return v if len(v) < 72 else preserve_literal(v)
if isinstance(base, dict):
for k in base:
v = base[k]
if isinstance(v, string_types) and '\n' in v:
base[k] = test_wrap(v)
else:
walk_tree(v)
elif isinstance(base, list):
for idx, elem in enumerate(base):
if isinstance(elem, string_types) and '\n' in elem:
base[idx] = test_wrap(elem)
else:
walk_tree(elem)
yaml = YAML()
with open("input.yaml", "r") as fi:
data = yaml.load(fi)
walk_tree(data)
with open("output.yaml", "w") as fo:
yaml.dump(data, fo)
得到输出:
- 1
- abc: "this is a short string scalar with a newline\nin it"
- |-
there are also a multiline
sequence element
in this file
and it is longer
一些说明:
>使用LiteralScalarString优先于PreservedScalarString.后者的名字是它唯一保留的字符串类型的残余.
>你可能没有字符串的序列元素,因为你没有导入preserve_lite,尽管它仍然在复制的代码中使用.
>我将“包装”代码分解为test_wrap,由值和元素包装使用,其最大行长度设置为72个字符.
>值data [1] [‘abc’]作为LiteralScalarString加载.如果要保留现有的文字样式字符串标量,则应在测试类型string_types之前测试那些标量.
>我使用新API和YAML()实例
>如果在示例中将72增加到默认值80以上,则可能必须将width属性设置为1000,以防止自动换行.(yaml.width = 1000)
内容总结
以上是互联网集市为您收集整理的python – 将YAML多行值转换为折叠块标量样式?全部内容,希望文章能够帮你解决python – 将YAML多行值转换为折叠块标量样式?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。