我已经获得了基于IP的地理位置数据库,其格式如下:
cluster_mode
一个CSV文件中总共包含超过300万行。每行的第一部分是CIDR格式的IP范围。
我需要一种有效的方法来快速在这些行中找到给定的IP地址。例如,在给定IP地址1.0.0.0/24,2077456,2077456,,0,0,,-33.4940,143.2104,1000
1.0.1.0/24,1814991,1814991,,0,0,,34.7725,113.7266,50
1.0.2.0/23,1814991,1814991,,0,0,,34.7725,113.7266,50
1.0.4.0/22,2077456,2077456,,0,0,,-33.4940,143.2104,1000
1.0.8.0/21,1814991,1814991,,0,0,,34.7725,113.7266,50
...
223.255.254.0/24,1880252,1880251,,0,0,37,1.3267,103.8869,5
223.255.255.0/24,2077456,2077456,,0,0,,-33.4940,143.2104,1000
的情况下,我想快速找到第二行,因此可以获取它的协调,即该行中的其余数据。我想知道是否有任何有效的方法来代替从头开始检查每一行。
困难在于,例如IP范围1.0.1.2
包含IP地址1.0.2.0/23
,因此仅字符串匹配将不能很好地工作。
答案 0 :(得分:0)
我自己找到了一条路。首先将分段的8位IP地址转换为十进制格式,这使CIDR格式的IP范围变为两个十进制数字。然后,我使用bisect
模块来查找IP所属的范围。
答案 1 :(得分:-1)
def search_line(csv, ip):
for line in csv:
if line.startswith(ip):
return line