【问题标题】:Compare keys of two ini files and copy the values of matched key's to second ini file in python比较两个ini文件的键并将匹配键的值复制到python中的第二个ini文件
【发布时间】:2019-02-08 15:51:06
【问题描述】:

我有两个 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.inib.ini 而不会干扰 cmets,因为这是结构良好的文件。如果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)

【问题讨论】:

标签: python file copy compare ini


【解决方案1】:

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

试试这个:

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

【讨论】:

    【解决方案2】:

    您可以使用以下代码

    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。

    【讨论】:

    • 它对我有用..@Arun Kumar。但在这里我需要将新的密钥对复制到temp.ini。比如如果在test.ini 中找到任何新的键值,那么这些键值应该被复制到temp.ini
    猜你喜欢
    • 2021-10-11
    • 1970-01-01
    • 2018-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多