比较两个ini文件的键,并将匹配键的值复制到python中的第二个ini文件

时间:2018-09-03 15:07:26

标签: python file copy compare ini

我有两个如下所示的INI文件a , b

文件a.ini

##########################################
## Application

## Var                          Values                  Comment
## --------                     ------------------      ----------------- 
------------------------------
## Application                   1,2                    Each server is attached to a valid point
##                                                      t2
##                                                      1 = dummy, 2 = hds
app=3
sv=2
type=ort
serv=t2
val=d7

文件b.ini

##########################################
## Application

## Var                          Values                  Comment
## --------                     ------------------      -------------------- 
---------------------------
## Application                   1                      Each server is attached to a valid point
##                                                      t2
##                                                      1 = dummy, 
app=3
sv=2
type=ort3
serv=t22
stage=5

我想比较a.ini的未注释键和b.ini的未注释键。因此,如果键匹配,那么我想将a.ini的匹配键的值复制到b.ini而不打扰注释,因为这是结构良好的文件。如果新密钥存在于a.ini中,则该密钥会盲目地复制到b.ini中。并且当我们将匹配的键值写入b.ini时,键的位置不应更改。

所以最终输出将如下所示

##########################################
## Application

## Var                          Values                  Comment
## --------                     ------------------      -------------------- 
---------------------------
## Application                   1                      Each server is attached to a valid point
##                                                      t2
##                                                      1 = dummy, 
app=3
sv=2
type=ort
serv=t2
stage=5
val=d7

我已经按照下面的方式进行了工作,但是直到读取两个INI文件的数据并打印匹配的字典密钥对后,它才起作用。

separator = "="
keys = {}
with open('test.ini') as f:
    for line in f:
        if separator in line:
            name, value = line.split(separator, 1)
            keys[name.strip()] = value.strip()
separator1 = "="
keys1 = {}
with open('temp.ini') as f1:
    for line in f1:
       if separator1 in line:
            name, value = line.split(separator1, 1)
            keys1[name.strip()] = value.strip()
for key, value in keys.viewitems() & keys1.viewitems():
    print(key, value)

2 个答案:

答案 0 :(得分:1)

您可以使用以下代码

with open("out.ini", 'w') as outfile_handle:
   for key, value in keys1.iteritems():
      outfile_handle.write("%s\n" % separator.join([key, keys.get(key, value)]))

更新

如果要合并两个文件中的所有密钥,则可以先创建两个密钥集的联合,然后对其进行迭代以形成文件。请参见下面的代码。

with open("out.ini", 'w') as outfile_handle:
   all_keys = set(keys.keys() + keys1.keys())
   for key in all_keys:
      val1 = keys.get(key)
      val2 = keys1.get(key)
      outfile_handle.write("%s\n" % separator.join([key, val2 or val1]))

在这里,使用val2或val1来确保我们更喜欢第二个文件的值而不是第一个文件的值。如果您需要第一个文件的值而不是第二个文件的值,则应使用val1或val2。

答案 1 :(得分:1)

您的最后一个循环不太正确。 for x in y & z不能像您认为的那样工作。另外,您必须使用and而不是&

尝试以下方法:

for key, value in keys.items():
    if key in keys1 and keys1[key] == value:
        print(key, value)