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加入这些部分。我刚刚编辑了我的问题,以便更清楚地说明我在问什么。