我在下面的代码的第二部分中遇到问题。该文件包含"Veth"
,"Po"
,"Eth"
的重复条目。如:
23 0050.5681.6e60 dynamic 10 F F Veth1300
23 0050.5681.6e60 dynamic 10 F F Veth1400
23 0050.5681.6e60 dynamic 10 F F Veth1500
我的全部想法是使用MAC("0050.5681.6e60"
)作为唯一键,并将接口("Veth1300"
)匹配并捕获到列表中作为MAC的值。类似的东西:
0050.5681.6e60 : [Veth1300, Veth1400, Veth1500]
出于某种原因,我在第二部分中的代码没有实现目标。第一部分中我的正则表达式部分正在按预期工作。我一直收到这个错误:
Traceback (most recent call last):
File "C:\Python27\Mastin_Veth.py", line 24, in <module>
if dict1[mac] != None:
KeyError: '0050.5681.6e60'
有人可以帮助诊断问题。 (下面的代码缩进是错误的,因为无法发布代码)
import re
MAC_keys = set()
dict1 = dict()
#Part I
with open('C:/Python27/dup_MAC_SR629930635.csv') as f:
for line in f:
regex = re.compile(r"\*\s*[0-9]{1,}\s*([0-9a-z]{4}.[0-9a-z]{4}.[0-9a-z]{4}).*(Veth\d+|Eth.*|Po\d+)$",re.IGNORECASE|re.DOTALL)
r = regex.search(line)
MAC_Key,MAC_associated_VETH = r.groups()
MAC_keys.add(MAC_Key)
#Part II
for mac in MAC_keys: # Iteration over SET of Keys
with open('C:/Python27/dup_MAC_SR629930635.csv') as f:
for line in f:
regex = re.compile(r"\*\s*[0-9]{1,}\s*([0-9a-z]{4}.[0-9a-z]{4}.[0-9a-z]{4}).*(Veth\d+|Eth.*|Po\d+)$",re.IGNORECASE|re.DOTALL)
r = regex.search(line)
MAC_Key,MAC_associated_VETH = r.groups()
if mac == MAC_Key:
#get the value associated with the key
if dict1[mac] != None:
tmp_values_list = list(dict1[mac])
tmp_values_list.append(MAC_associated_VETH)
dict1.update({mac:tmp_values_list })
elif dict1[mac] == None:
tmp_values_list = [MAC_associated_VETH]
dict1[mac] = tmp_values_list
答案 0 :(得分:0)
您将第I部分中的键添加到集MAC_Keys
,但它们不在dict1
中;它仍然是一个空字典,因此在KeyError
上dict1[mac]
。
您可以使用dict1.get(mac)
,如果密钥不存在,将返回None
。此外,您应该真正检查None
为is not None
,而不是!= None
,而elif
是没有意义的 - 它是None
或者它不是,只是放else
。
然而,这似乎是一种过于复杂的做事方式。每次迭代集合中的键和整个文件都是低效的,特别是考虑到你可以检查if MAC_Key in MAC_Keys:
。此外,使用tmp_values_list
和update
是一个很长的路,你可以直接append
到dict1[mac]
。
相反,我建议:
from collections import defaultdict
out = defaultdict(list)
with open(...) as f:
for line in f:
parts = line.strip().split()
out[parts[1]].append(parts[6])
这可以在一次传递中完成所有操作,而无需正则表达式。即使您保留正则表达式,单个循环和defaultdict
也会使您的代码更清晰,更易于编写和维护。