使用此数据结构:
d = {
(2,3,4): {
'a': [1,2],
'b': 'Hello World!',
'c': 'Voilà!'
}
}
我想要这个山药:
%YAML 1.2
---
[2,3,4]:
a:
- 1
- 2
b: Hello World!
c: 'Voilà!'
不幸的是,我得到了这个格式:
$ print ruamel.yaml.dump(d, default_flow_style=False, line_break=1, explicit_start=True, version=(1,2))
%YAML 1.2
---
? !!python/tuple
- 2
- 3
- 4
: a:
- 1
- 2
b: Hello World!
c: !!python/str 'Voilà!'
即使使用safe_dump
,我也无法配置所需的输出。如果没有对输出进行手动regex操作,我如何才能做到这一点?
我找到的唯一丑陋的解决办法是:
def rep(x):
return repr([int(y) for y in re.findall('^\??\s*-\s*(\d+)', x.group(0), re.M)]) + ":\n"
print re.sub('\?(\s*-\s*(\w+))+\s*:', rep,
ruamel.yaml.dump(d, default_flow_style=False, line_break=1, explicit_start=True, version=(1,2)))
新的ruamel.yaml API
使用
ruamel.yaml.dump()
无法获得所需的内容,但是使用新的API 再控制几下,你就可以接近了。它给出:
仍然没有简单的方法来抑制序列项之前的空格,因此如果不付出很大努力,就无法获得
[2,3,4]
替代[2, 3, 4]
。原始答案:
使用
ruamel.yaml.dump()
如果不对内部进行重大修改,就无法获得所需的输出。a
,b
等)和序列元素的缩进4,序列元素是a
键的值(在2个位置按下-
)。这至少需要对映射和序列的缩进级别进行区分(如果不是针对单个集合的话),这是非常重要的。,
(逗号,空格)压缩为“普通”流样式发出的,
。IIRC这目前不受任何参数的影响,而且由于您在发出集合时几乎没有上下文知识,因此很难“在发出键序列时不包括空格”。dump()
的另一个选项需要更改几个源文件和类。不那么困难的问题,有解决方案的迹象:
!!python/tuple
。因为您不想影响所有元组,所以最好通过创建tuple
的子类并将其表示为序列(如果实际用作键,则可以选择将此类元组表示为list)。您可以为此使用comments.CommentedKeySeq
(假设ruamel.yaml>=0.12.14
,在使用ruamel.yaml.round_trip_dump()
时,它有适当的表示支持)SequenceStartEvent
启动一个简单的键(如果它具有流样式而不是块样式)。另一个问题是,这样的SequenceStartEvent将被“测试”为具有style
属性(这可能表示显式需要'?'按键)。这需要更改emitter.py:Emitter.check_simple_key()
和emitter.py:Emitter.expect_block_mapping_key()
。c
的标量字符串值获取引号,而b
的标量字符串值不获取引号。只有将ruamel.yaml中的输出设置为不同的类型,才能获得这种差异。E、 g.将其设置为scalarstring.SingleQuotedScalarString()
(并使用round_trip_dump()
)。如果你这样做了:
你将得到:
除了现在一致的缩进级别2之外,流样式序列中的额外空格和
round_trip_dump
的必要使用,将使您在不进行重大修改的情况下尽可能接近您想要的内容。上面的代码是不是也很难看,这当然是一个品味的问题。
使用
ruamel.yaml.round_trip_load(preserve_quotes=True)
加载时,输出将正确往返。如果不需要对引号进行控制,而且映射键的顺序也不重要,则还可以修补普通转储程序:
然后可以使用正常序列:
会给你:
请注意,需要使用
allow_unicode=True
在输出中显式地允许unicode(默认为round_trip_dump()
)。1免责声明:我是ruamel.yaml的作者。
相关问题 更多 >
编程相关推荐