Сравните ключи двух INI-файлов и скопируйте значения соответствующих ключей во второй INI-файл в Python - PullRequest
0 голосов
/ 03 сентября 2018

У меня есть два 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 голосов
/ 03 сентября 2018

Ваш последний цикл не совсем правильный. for x in y & z не работает так, как вы думаете. Кроме того, вы должны использовать and вместо &.

Попробуйте вместо этого:

for key, value in keys.items():
    if key in keys1 and keys1[key] == value:
        print(key, value)
0 голосов
/ 03 сентября 2018

Вы можете использовать следующий код

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, если вам нужно предпочесть значение первого файла второму.

...