我有一个普通的数据结构,我需要将其转储到YAML文件中,并在开头添加一个!v2
行的类型标记。
如何使用PyYAML库?
import yaml
class MyDumper(yaml.SafeDumper):
# ???
# somehow add a "!v2" type tag at the beginning
y = {'foo': 3, 'bar': 'haha', 'baz': [1,2,3]}
with open(myfile, 'w') as f:
# a hack would be to write the "!v2" here,
# outside the normal yaml.dump process,
# but I'd like to learn the right way
yaml.dump(f, y, Dumper=MyDumper)
答案 0 :(得分:1)
如果我正确地读了你的!v2
,那么它本质上是顶级词典的标签(从而隐含了整个文件)。为了用标签正确地写出来,将顶级字典转换为单独的类型(从dict子类)并创建一个特定类型的转储器:
import ruamel.yaml as yaml
from ruamel.yaml.representer import RoundTripRepresenter
class VersionedDict(dict):
pass
y = VersionedDict(foo=3, bar='haha', baz=[1,2,3])
def vdict_representer(dumper, data):
return dumper.represent_mapping('!v2', dict(data))
RoundTripRepresenter.add_representer(VersionedDict, vdict_representer)
print(yaml.round_trip_dump(y))
会给你:
!v2
bar: haha
foo: 3
baz:
- 1
- 2
- 3
roundtrip_dump
一个safe_dump
请注意,当您以某种方式使用yaml.load()
加载时,您的加载程序希望为constructor
标记类型找到!v2
,除非您阅读了第一行之外的第一行实际的装载程序。
如果你必须坚持使用PyYAML(例如,如果你必须坚持使用YAML 1.1),那么ruamel.yaml
(其中我是作者)是PyYAML的增强版本,那么你应该这样做能够相对容易地做出必要的改变。请确保在使用SafeRepresenter
时将代表服务器添加到您用于转储的代表服务器:safe_dump
。