Присоединение к подобным разделам из configparser - PullRequest
0 голосов
/ 07 апреля 2020

Доброе утро,

У меня есть файл конфигурации с такими данными:

[hostset 1]
ip = 192.168.122.136
user = test
password =
pkey = ~/.ssh/id_rsa

[hostset 2]
ip = 192.168.122.138
user = test
password =
pkey = ~/.ssh/id_rsa

Я хочу иметь возможность присоединиться к ips любого заданного числа наборов хостов в этой конфигурации файл, если другие значения совпадают, поэтому загруженные и отформатированные данные будут храниться в формате dict, что-то вроде этого:

{
 ip: ['192.168.122.136', '192.168.122.138'],
 user: 'test',
 password: '',
 pkey: '~/.ssh/id_rsa',
}

, выполнив что-то вроде:

from configparser import ConfigParser


def unpack(d):
    return [value for key, value in d.items()]


def parse(configuration_file):
    parser = ConfigParser()
    parser.read(configuration_file)

    hosts = [unpack(connection) for connection in [section for section in dict(parser).values()]][1:]

    return [i for i in hosts]


if __name__ == '__main__':
    parse('config.ini')

I можно получить список списков, содержащих элементы файла конфигурации, например:

[['192.168.122.136', 'test', '', '~/.ssh/id_rsa'], ['192.168.122.138', 'test', '', '~/.ssh/id_rsa']]

Тогда мне просто нужен способ сравнения двух списков, и если все элементы похожи, кроме ip, то присоединиться их в список вроде:

[['192.168.122.136','192.168.122.138'], 'test', '', '~/.ssh/id_rsa']

Так что мне просто нужен умный способ сделать это со списком списков без определенной длины c и объединить все подобные списки.

Ответы [ 2 ]

1 голос
/ 07 апреля 2020

Получил помощь от друга и решил вопрос. Ключ заключался в том, чтобы сделать значения, которые я хотел сравнить, в кортеж, превратив в него кортеж, ключ к словарю и значение ips. Из этого. Я могу утверждать, что если ключ кортежа уже существует, тогда я добавлю ip к значению.

from configparser import ConfigParser
from ast import literal_eval as literal


def unpack(d):
    return [value for key, value in d.items()]


def parse(configuration_file):
    parser = ConfigParser()
    parser.read(configuration_file)

    hosts = [unpack(connection) for connection in [section for section in dict(parser).values()]][1:]

    d = dict()
    for item in hosts:
        try:
            d[str((item[1:]))].append(item[0])
        except KeyError:
            d[str((item[1:]))] = [item[0]]

    return d


if __name__ == '__main__':
    for k, v in parse('config.ini').items():
        print([v, *literal(k)])
0 голосов
/ 07 апреля 2020

В этом решении я предположил, что формат файла точно такой, как описано в вопросе: сначала мы разбиваем наборы хостов: мы предполагаем, что ваши данные находятся в переменной rowdata

HostSets = rowdata.split("[hostset ") # first element is empty
Dict = {}

for i in range (1,len(HostSets)):
    l = HostSets[i].split("ip = ")#two elements the first is trash
    ip = l[1].split()[0]
    conf =l[1].split("\n",1 )[1] #splits only the first element 
    try :
        Dict[conf].append(ip)
    except :
        Dict[conf] = list()
        Dict[conf].append(ip)        
print('{')
for element in Dict:
    print("ip: ",Dict[element],",",element)
print('}')
...