Python访问纯真IP数据库脚本分享
项目中有这样的需求,通过IP地址判断客户端是网通的还是电信的。从同事那拿了个纯文本的IP纯真数据库,用Python写了一个小程序,感觉挺好的。下面给出实现源码:
#!/usr/bin/envpython
#-*-coding:utf-8-*-
frombisectimportbisect
_LIST1,_LIST2=[],[]
_INIT=False
ip2int=lambdaip_str:reduce(lambdaa,b:(a<<8)+b,[int(i)foriinip_str.split('.')])
def_init():
global_LIST,_INIT
ifnot_INIT:
forlinopen('ipdata.txt','rb'):
ip1,ip2=l.split()[:2]
addr=''.join(l.split()[2:])
ip1,ip2=ip2int(ip1),ip2int(ip2)
_LIST1.append(ip1)
_LIST2.append((ip1,ip2,addr))
_INIT=True
defip_from(ip):
_init()
i=ip2int(ip)
idx=bisect(_LIST1,i)
assert(idx>0)
iflen(_LIST1)<=idx:
returnu'unknownipaddress%s'%ip
else:
frm,to,addr=_LIST2[idx-1]
iffrm<=i<=to:
returnaddr
else:
returnu'unknownipaddress%s'%ip
if__name__=='__main__':
printip_from('115.238.54.106')
printip_from('220.181.29.160')
printip_from('115.238.54.107')
printip_from('8.8.8.8')