>我有两个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)
你的最后一个循环不太正确。for x in y & z
并不像你想象的那样工作。 另外,您必须使用and
而不是&
.
试试这个:
for key, value in keys.items():
if key in keys1 and keys1[key] == value:
print(key, value)
您可以使用以下代码
with open("out.ini", 'w') as outfile_handle:
for key, value in keys1.iteritems():
outfile_handle.write("%sn" % 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("%sn" % separator.join([key, val2 or val1]))
在这里,val2 或 val1 用于确保我们更喜欢第二个文件的值而不是第一个文件的值。如果您需要优先选择第一个文件的值而不是第二个文件的值,则应使用 val1 或 val2。