河北省建设厅网站,网站数据库 数据库空间购买租用,视频在线直播网站建设,好学校平台网站模板下载不了Python之ruamel.yaml模块详解#xff08;二#xff09;4 将YAML解析为Python对象并修改5 使用旧API将YAML解析为Python对象并修改6 使用[]和.get()访问合并的键#xff1a;7 使用insert()方法插入内容8 使用yaml.indent()更改默认缩进9 使用yaml.compact()隔行显示10 同一数…
Python之ruamel.yaml模块详解二4 将YAML解析为Python对象并修改5 使用旧API将YAML解析为Python对象并修改6 使用[]和.get()访问合并的键7 使用insert()方法插入内容8 使用yaml.indent()更改默认缩进9 使用yaml.compact()隔行显示10 同一数据使用三个转储生成一个包含三个文档的流11 将YAML输出作为字符串接上文Python之ruamel.yaml模块详解一以下为官网的几个案例
4 将YAML解析为Python对象并修改
import sys
from ruamel.yaml import YAMLinp \
# example
name:# detailsfamily: Smith # very commongiven: Alice # one of the siblings
yaml YAML()
code yaml.load(inp)
code[name][given] Bobyaml.dump(code, sys.stdout)结果是
# example
name:# detailsfamily: Smith # very commongiven: Bob # one of the siblings5 使用旧API将YAML解析为Python对象并修改
from __future__ import print_functionimport sys
import ruamel.yamlinp \
# example
name:# detailsfamily: Smith # very commongiven: Alice # one of the siblings
code ruamel.yaml.load(inp, ruamel.yaml.RoundTripLoader)
code[name][given] Bobruamel.yaml.dump(code, sys.stdout, Dumperruamel.yaml.RoundTripDumper)# the last statement can be done less efficient in time and memory with
# leaving out the end would cause a double newline at the end
# print(ruamel.yaml.dump(code, Dumperruamel.yaml.RoundTripDumper), end)结果是
# example
name:# detailsfamily: Smith # very commongiven: Bob # one of the siblings6 使用[]和.get()访问合并的键
from ruamel.yaml import YAMLinp \
- CENTER {x: 1, y: 2}
- LEFT {x: 0, y: 2}
- BIG {r: 10}
- SMALL {r: 1}
# All the following maps are equal:
# Explicit keys
- x: 1y: 2r: 10label: center/big
# Merge one map
- : *CENTERr: 10label: center/big
# Merge multiple maps
- : [*CENTER, *BIG]label: center/big
# Override
- : [*BIG, *LEFT, *SMALL]x: 1label: center/big
def func():yaml YAML()data yaml.load(inp)print(data)print(data[7][y])assert data[7][y] 2if __name__ __main__:func()结果是
[ordereddict([(x, 1), (y, 2)]),
ordereddict([(x, 0), (y, 2)]),
ordereddict([(r, 10)]),
ordereddict([(r, 1)]),
ordereddict([(x, 1), (y, 2), (r, 10), (label, center/big)]), ordereddict([(r, 10), (label, center/big), (x, 1), (y, 2)]), ordereddict([(label, center/big), (x, 1), (y, 2), (r, 10)]), ordereddict([(x, 1), (label, center/big), (r, 10), (y, 2)])]
2使用.get()方法如下
from ruamel.yaml import YAMLinp \
- CENTER {x: 1, y: 2}
- LEFT {x: 0, y: 2}
- BIG {r: 10}
- SMALL {r: 1}
# All the following maps are equal:
# Explicit keys
- x: 1y: 2r: 10label: center/big
# Merge one map
- : *CENTERr: 10label: center/big
# Merge multiple maps
- : [*CENTER, *BIG]label: center/big
# Override
- : [*BIG, *LEFT, *SMALL]x: 1label: center/big
def func():yaml YAML()data yaml.load(inp)print(data)print(f1、[]方法为{data[7][y]})print(f2、.get()方法为{data[7].get(y)})assert data[7][y] 2if __name__ __main__:func()结果是
[ordereddict([(x, 1), (y, 2)]),
ordereddict([(x, 0), (y, 2)]),
ordereddict([(r, 10)]),
ordereddict([(r, 1)]),
ordereddict([(x, 1), (y, 2), (r, 10), (label, center/big)]), ordereddict([(r, 10), (label, center/big), (x, 1), (y, 2)]), ordereddict([(label, center/big), (x, 1), (y, 2), (r, 10)]), ordereddict([(x, 1), (label, center/big), (r, 10), (y, 2)])]
[]方法为2
.get()方法为27 使用insert()方法插入内容
import sys
from ruamel.yaml import YAMLyaml_str \
first_name: Art
occupation: Architect # This is an occupation comment
about: Art Vandelay is a fictional character that George invents...
yaml YAML()
data yaml.load(yaml_str)
data.insert(1, last name, Vandelay, commentnew key)
yaml.dump(data, sys.stdout)结果为以下可以发现插入了数据last name: Vandelay
first_name: Art
last name: Vandelay # new key
occupation: Architect # This is an occupation comment
about: Art Vandelay is a fictional character that George invents...8 使用yaml.indent()更改默认缩进
默认情况下ruamel.yaml以块样式缩进两个位置用于映射和序列对于序列缩进计算到标量的开头破折号位于缩进的“空格”的第一个位置可以通过例如使用yaml.indent来更改此默认缩进
import sys
from ruamel.yaml import YAMLd dict(adict(b2),c[3, 4])
yaml YAML()
yaml.dump(d, sys.stdout)
print(0123456789)
yaml YAML()
yaml.indent(mapping4, sequence6, offset3)
yaml.dump(d, sys.stdout)
print(0123456789)结果为
a:b: 2
c:- 3- 4
0123456789
a:b: 2
c:- 3- 4
01234567899 使用yaml.compact()隔行显示
如果一个块序列或块映射是一个序列的元素则默认情况下会显示紧凑的符号这意味着“父”序列的破折号与第一个元素resp位于同一行子集合的第一个键/值对。如果希望其中一个或两个序列内的序列序列内的映射从下一行开始可以使用yaml.compact
import sys
from ruamel.yaml import YAMLd [dict(b2), [3, 4]]
yaml YAML()
yaml.dump(d, sys.stdout)
print(*15)
yaml YAML()
yaml.compact(seq_seqFalse, seq_mapFalse)
yaml.dump(d, sys.stdout)结果是
- b: 2
- - 3- 4-b: 2
-- 3- 410 同一数据使用三个转储生成一个包含三个文档的流
import sys
from ruamel.yaml import YAMLdata {1: {1: [{1: 1, 2: 2}, {1: 1, 2: 2}], 2: 2}, 2: 42}yaml YAML()
yaml.explicit_start True
yaml.dump(data, sys.stdout)
yaml.indent(sequence4, offset2)
yaml.dump(data, sys.stdout)def sequence_indent_four(s):# this will fail on direclty nested lists: {1; [[2, 3], 4]}levels []ret_val for line in s.splitlines(True):ls line.lstrip()indent len(line) - len(ls)if ls.startswith(- ):if not levels or indent levels[-1]:levels.append(indent)elif levels:if indent levels[-1]:levels levels[:-1]# same - do nothingelse:if levels:if indent levels[-1]:while levels and indent levels[-1]:levels levels[:-1]ret_val * len(levels) linereturn ret_valyaml YAML()
yaml.explicit_start True
yaml.dump(data, sys.stdout, transformsequence_indent_four)结果是
---
1:1:- 1: 12: 2- 1: 12: 22: 2
2: 42
---
1:1:- 1: 12: 2- 1: 12: 22: 2
2: 42
---
1:1:- 1: 12: 2- 1: 12: 22: 2
2: 4211 将YAML输出作为字符串
以下是新API的实现方法
import sys
from ruamel.yaml import YAML
from ruamel.yaml.compat import StringIOclass MyYAML(YAML):def dump(self, data, streamNone, **kw):inefficient Falseif stream is None:inefficient Truestream StringIO()YAML.dump(self, data, stream, **kw)if inefficient:return stream.getvalue()yaml MyYAML() # or typsafe/unsafe etc
print(yaml.dump(dict(a1, b2)))旧API是如下
yaml.dump((dict(a1, b2)), sys.stdout)
print() # or sys.stdout.write(\n)