2016-03-01 41 views
1

使用meld/xxdiff /或其他东西?如何“合并”两个YAML文本文件?

说如果我有两个yaml文件,我怎么能自动合并它们?他们每个人都有几百行。公共部分为abc:

abc: 
    x: 
    0: null 
    y: 
    1: null 

def: 
    x: 
    0: string 

... 

abc: 
    u: null 
    v: null 
    w: null 

def: 
    u: 
    0: null 
    v: null 
    w: null 
... 

期望的结果:

abc: 
    x: 
    0: null 
    y: 
    1: null 
    u: null 
    v: null 
    w: null 

def: 
    x: 
    0: string 
    u: 
    0: null 
    v: null 
    w: null   

可以在此与任何差异来完成/合并工具?

编辑:在理想的结果固定错字

+0

是不是'def'一个共同的部分呢?你真的想合并吗? 'abc',但是'def'有不同的条目? – morxa

+0

由于你的输出是[不再有效的YAML](http://www.yaml.org/spec/1.2/spec.html#id2764652),你能告诉我们你要做什么吗?在什么基础上'abc'键值被合并,'def'键的值不是?第一个位置?实际的名字?如果'abc'在第二个文件中的'def'之后会发生什么?你的输入文件是否真的是YAML这样简单的子集,例如映射条目之间没有注释,没有锚? – Anthon

+0

啊对不起,只是错字。我会编辑我的问题。我想最终结果是有效的yaml,但有两个文件合并。 @安永是我的输入文件和上面一样简单,没有评论。 – Shuman

回答

0

我不认为你可以做你想做什么,而不解析文件。但是你可以用很短的Python程序这样做:

import sys 

import ruamel.yaml 

data = None 

for file_name in sys.argv[1:]: 
    d = ruamel.yaml.round_trip_load(open(file_name, 'rb')) 
    if data is None: 
     data = d 
     continue 
    for k in d: 
     data[k].update(d[k]) 

print(ruamel.yaml.round_trip_dump(data, indent=2, explicit_end=True)) 

这给(假设相应的输入文件:

abc: 
    x: 
    0: 
    y: 
    1:  

    u: 
    v: 
    w: 
def: 
    x: 
    0: string 
    u: 
    0: 
    v: 
    w: 
... 

请注意额外的空格会丢失为ruamel.yaml(披露:我是如果需要超过顶级密钥合并,您还需要使.update()更智能化,也就是递归式,

+0

目前没有简单的方法将python None值显式转储回显式空值。可以使用一些额外的代码来完成 – Anthon