用户 = matches[1] 对象没有属性 '_getitem_' Python 错误

0 投票
1 回答
536 浏览
提问于 2025-04-18 14:37

我的Python脚本在运行时出现了错误

['dc:9f:db:1a:60:62']

追踪信息(最近的调用在最前面): 文件 "search.py",第 26 行,在 <模块> 中 user = matches[1] 类型错误:'可调用迭代器'对象没有属性 '__getitem__'

我的脚本如下

import re

austins_mac_address = "f8:27:93:88:1c:95"

dd = {'f8:27:93:88:1c:95' : 'Austin iPhone', 'dc:9f:db:1a:60:64' : '4-Ops-AP', 'dc:9f:db:1a:60:62' : '4-TechOffices-AP', 'dc:9f:db:1a:61:b9' : '7-SalesReception-AP', 'dc:9f:db:1a:60:63' : '7-Marketing-AP', 'dc:9f:db:1a:61:bd' : '7-Sales-Engineers-AP', 'dc:9f:db:1a:60:f3' : '4-Dev-AP', 'dc:9f:db:1a:2c:dd' : '4-Hurricane-AP', '24:a4:3c:02:cf:f6' : '6-Meeting-AP', 'dc:9f:db:1a:60:ef' : '4-Lounge-AP', 'dc:9f:db:1a:61:ba' : '7-QA-AP', 'dc:9f:db:1a:60:5f' : '4-TechFloor-AP', 'dc:9f:db:1a:2d:95' : '4-training1-AP'}

dat = '[2014-07-22 10:21:06,821] <inform_stat-3> WARN event - [event] User[e4:98:d6:27:4c:b6] 从 AP[dc:9f:db:1a:60:64] 漂移到 AP[dc:9f:db:1a:2d:95] 在 "channel 11(ng)"' aps = [] import re for line in open("server.log"): matches = re.finditer('(([0-9a-f]{2}[:-]){5}[0-9a-f]{2})', line) if matches: macAddrs = [] for match in matches: macAddrs.append(match.group(0)) print(macAddrs) user = matches[1] if (user.equals(austins_mac_address)): source = matches[3] dest = matches[5]

1 个回答

1

问题在于,matches 是一个迭代器,因为 re.finditer 返回的就是这个。迭代器是动态生成数据的;它并不是一次性把所有数据都放在一个结构里。这就是为什么你不能直接访问它的第二个元素。迭代器的设计是为了让你一次性循环使用(就像你在 for match in matches 中那样),而不是随时随机访问其中的元素。

如果你想像 matches[1] 这样随机访问元素,你需要先遍历这个迭代器,把它的数据存储到另一个列表里。

raw_matches = re.finditer('(([0-9a-f]{2}[:-]){5}[0-9a-f]{2})', line)
if raw_matches:
        matches = []
        for match in raw_matches:
                matches.append(match)

大概就是这样,前提是第一个对象在生成第二个对象时没有被销毁。

撰写回答