Python3跨文件MAC地址匹配与行合并脚本调试求助
问题分析与解决方案
首先看你遇到的ValueError: not enough values to unpack (expected 5, got 4)错误,原因很直接:你的file1每行用split()拆分后只有4个字段,但你却试图把它解包到5个变量里(ip_addr, _, mac, _, status),这肯定会报错。
咱们一步步来修正这个脚本:
1. 修复file1的读取逻辑
file1的每行结构是:IP 0 MAC "VlanXXX, Port-ChannelXXX",最后一个字段包含逗号和空格,所以不能直接用默认的split()(会把它拆成两个部分)。应该用split(maxsplit=3),这样只会拆分前3个空白,把最后一个带空格的字段保留为整体:
with open(INPUT_FILE_1) as file1: for line in file1: # 用for循环遍历行比readline更简洁 line = line.strip() if not line: continue # 拆分前3个空白,最后一个字段作为port_info ip_addr, _, mac, port_info = line.split(maxsplit=3) # 把port_info里的逗号去掉,转换成期望的格式(比如Vlan100 Port-Channel230) cleaned_port_info = port_info.replace(',', '') # 用mac小写作为键,存储ip和清理后的port信息 mapping_dict[mac.lower()] = (ip_addr, cleaned_port_info)
2. 修复file2的读取逻辑
file2的每行结构是: 4 MAC DYNAMIC PoXX 1 时间,拆分后是6个字段,而且你之前的代码里错误地用了未定义的mac和ip_addr变量,这也会报错。修正后的逻辑:
with open(INPUT_FILE_2) as file2: for line in file2: line = line.strip() if not line: continue # 拆分所有空白,提取需要的mac和port字段 _, mac, _, port, _, _ = line.split() # 从字典里获取对应的ip和port信息,没找到的话留空 ip_addr, port_info = mapping_dict.get(mac.lower(), ('', '')) # 只输出匹配到的结果(如果需要的话,也可以处理未匹配的情况) if ip_addr: print(f"{ip_addr} {mac} {port} {port_info}")
3. 完整修正后的脚本
#!/usr/bin/python3 # port_details.py mapping_dict = {} INPUT_FILE_1 = 'file1' INPUT_FILE_2 = 'file2' # 处理file1,构建mac到(ip, port_info)的映射 with open(INPUT_FILE_1) as file1: for line in file1: line = line.strip() if not line: continue ip_addr, _, mac, port_info = line.split(maxsplit=3) cleaned_port_info = port_info.replace(',', '') mapping_dict[mac.lower()] = (ip_addr, cleaned_port_info) # 处理file2,匹配mac并输出合并结果 with open(INPUT_FILE_2) as file2: for line in file2: line = line.strip() if not line: continue _, mac, _, port, _, _ = line.split() result = mapping_dict.get(mac.lower()) if result: ip_addr, port_info = result print(f"{ip_addr} {mac} {port} {port_info}")
4. 其他注意点
- 用
for line in file的方式遍历文件行比while readline()更Pythonic,也更不容易出错; - 统一把mac转换成小写(或者大写)存储和匹配,避免因为大小写不一致导致匹配失败;
- 你的示例file1里有几个MAC看起来不符合标准格式(比如
001c.0724.tb6a里的t,01c.0718.1t9c少了一位),如果需要验证MAC格式,可以额外加校验逻辑,不过脚本会按原样处理这些值。
运行这个修正后的脚本,就能得到你期望的输出格式啦。
内容的提问来源于stack exchange,提问作者krock1516
相关产品推荐
相关产品推荐

