Python 从configparser连接类似的部分

Python 从configparser连接类似的部分,python,python-3.x,ini,Python,Python 3.x,Ini,早上好 我有一个配置文件,其中包含如下数据: [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 如果其他值相同,我希望能够在此配置文件中加入任意给定数量主机集的IP,因此摄取和格式化的数据将存储在dict中,如下所示: [hostset

早上好

我有一个配置文件,其中包含如下数据:

[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
如果其他值相同,我希望能够在此配置文件中加入任意给定数量主机集的IP,因此摄取和格式化的数据将存储在dict中,如下所示:

[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
{
ip:['192.168.122.136','192.168.122.138'],
用户:“测试”,
密码:“”,
pkey:“~/.ssh/id\u rsa”,
}
通过这样做:

从configparser导入configparser
def拆包(d):
返回[键的值,d.items()中的值]
def解析(配置文件):
parser=ConfigParser()
读取(配置文件)
hosts=[dict(解析器).values()][1:]
返回[主机中的i为i]
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
解析('config.ini')
我可以获得包含配置文件元素的列表列表,如下所示:

[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
['192.168.122.136','test',''.-/.ssh/id\u rsa'],['192.168.122.138','test','.-/.ssh/id\u rsa']
然后我只需要一种比较两个列表的方法,如果除了ip之外所有元素都相似,那么将它们连接到一个列表中,如:

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

因此,我只需要一种聪明的方法,通过一个没有特定长度的列表来实现这一点,并将所有类似的列表连接起来。

在这个解决方案中,我假设文件格式与问题中描述的完全相同: 首先,我们拆分主机集: 我们假设您的数据在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('}')

得到朋友的帮助,解决了这个问题。关键是把我想要比较的值做成一个元组,把那个元组变成字典的键,把值变成ips。从这个。我可以断言,如果元组键已经存在,那么我将把ip附加到该值

从configparser导入configparser
从ast导入文字\u评估为文字
def拆包(d):
返回[键的值,d.items()中的值]
def解析(配置文件):
parser=ConfigParser()
读取(配置文件)
hosts=[dict(解析器).values()][1:]
d=dict()
对于主机中的项目:
尝试:
d[str((项目[1:]))]。追加(项目[0])
除KeyError外:
d[str((项目[1:])]=[项目[0]]
返回d
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
对于k,在parse('config.ini')中使用v。items()
打印([v,*文字(k)])

您尝试过什么?您使用的是
configparser
吗?是的,我目前正在使用configparser读取.ini文件:
python from configparser import configparser=configparser()parser.read('config.ini')
如果我们使用dict()查看它,它将返回如下内容:
python{'DEFAULT':,'hostset 1':,'hostset 2':}
问题在于如何巧妙地迭代所有部分,以检查匹配的用户/密钥/通行证,然后通过ip加入这些部分。我刚刚编辑了我的问题,以便更清楚地说明我在问什么。