在文件中输入列表项

瓦赛

下午好,我有多个IP和MAC列表,任意长度的列表

A = [['10.0.0.1','00:4C:3S:**:**:**', 0], ['10.0.0.2', '00:5C:4S:**:**:**', 0], [....], [....]]

我想检查这个MAC是否在oui文件中:

E043DB   (base 16)   Shenzhen
2405f5   (base 16)   Integrated
3CD92B   (base 16) Hewlett Packard
...

如果列表中的 MAC 在文件中,则将制造商名称写为 3 个列表项。我正在尝试这样做,结果只检查第一个元素,未检查其余元素,我该怎么做,请告诉我?

f = open('oui.txt', 'r')
for values in A:
    for line in f.readlines():
        if values[1][0:8].replace(':','') in line:
            values[2]=(line.split('(base 16)')[1].strip())
f.close()
print (A)

并得到答案:

A = [['10.0.0.1','00:4C:3S:**:**:**', 'Firm Name'], ['10.0.0.2', '00:5C:4S:**:**:**', 0], [....], [....]]
惊骇

问题

考虑代码的“形状”:

f = open('a file')
for values in [ 'some list' ]:
    for line in f.readlines():

你的两个循环正在这样做:

Start with first value in list
Read all lines remaining in file object f
Move to next value in list
Read all lines remaining in file object f

除了第一次告诉它“读取剩余的所有行”时,它会这样做。

因此,除非您有某种方法将更多行放入 f(这可能发生在像 stdin 这样的异步文件中!),否则您将获得一次“良好”的文件传递,然后文件对象的每个后续传递都将指向文件的结尾,所以你什么也得不到。

一个解法

当您处理一个文件时,您只想处理一次。与其他操作相比,文件 I/O 是昂贵的。所以你可以选择 (a) 将整个文件读入内存,然后做任何你想做的事情,因为它不再是一个文件;或 (b) 仅扫描一次。

如果您选择只扫描一次,简单的解决方案就是反转两个 for 循环。而不是这样做:

for item in list:
    for line in file:

改为这样做:

for line in file:
    for item in list:

而且很快!您现在只读取文件一次。

其他注意事项

如果我查看您的代码和示例,您似乎正在尝试对特定键进行精确匹配您可以修剪列表中的 MAC 地址以根据制造商 ID 检查它们。

这向我表明,您可能拥有比制造商更多的列表值(源 MAC 地址)。因此,也许您应该考虑将 tile 的内容读入内存,而不是一次处理一行。

将文件保存在内存中后,请考虑构建合适的字典。您有一个密钥(MAC 前缀)和一个值(制造商)。所以构建类似的东西:

for line in f:
    mac = line.split('(base 16)')[0].strip()
    mfg = line.split('(base 16)')[1].strip()
    mac_to_mfg[mac] = mfg

然后,您可以遍历源地址并使用 dict 的 O(1) 查找对您有利:

for src in A:
    prefix = src[1][:8].replace(':', '')
    if prefix in mac_to_mfg:
        # etc...

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何基于输入列表批量更改文件中的文本

来自分类Dev

将文件中的行转换为输入列表

来自分类Dev

通过jQuery在UL中插入列表项

来自分类Dev

如何在 WTForms 中输入列表?

来自分类Dev

在 Pandas 列中输入列表值

来自分类Dev

如何导入列表项?

来自分类Dev

根据输入列表复制文件,文件名中包含特殊字符

来自分类Dev

是否可以在不输入列表项的情况下定义对列表项的操作?- 安卓

来自分类Dev

获取包含当前会话中存在的输入的输入列表

来自分类Dev

自动聚焦列表项中的表单输入

来自分类Dev

如何从用户输入中调用列表项

来自分类Dev

根据输入列表Python下载文件

来自分类Dev

根据输入列表Python重命名文件

来自分类Dev

根据输入列表Python重命名文件

来自分类Dev

创建一个读取文件输入列表的函数

来自分类Dev

用jQuery插入列表项的问题

来自分类Dev

根据条件动态插入列表项

来自分类Dev

在类中输入列表无法获取对象

来自分类Dev

比较Python输入列表中的字符串

来自分类Dev

LinkedList构造函数,允许用户输入列表中的元素

来自分类Dev

在类中写出整个输入列表以进行模型预测

来自分类Dev

从输入列表中查找最大数量

来自分类Dev

将文件夹中的 xml 文件放入列表

来自分类Dev

从python中的单独文件导入列表变量

来自分类Dev

如何使用R在.txt文件中写入列表

来自分类Dev

用python写入列表并在文件中添加空格

来自分类Dev

将.txt文件的内容放入列表中

来自分类Dev

将 txt 文件中的行读入列表视图

来自分类Dev

python count列表项的出现并将结果放入列表