1、使用socket库对ip进行排序
示例代码:
import socket
ip_list = ['10.5.11.1', '192.168.1.33', '10.5.2.4', '10.5.1.3', '10.5.11.13', '10.5.11.12', '10.5.1.1', '10.5.1.2',
'10.5.1.11', '10.5.1.13']
print(sorted(ip_list, key=socket.inet_aton))
for i in sorted(ip_list, key=socket.inet_aton):
print(i)
运行结果:
2、使用sort()函数构造排序
示例代码:
ip_list = ['192.168.1.33', '10.5.2.4', '10.5.1.3', '202.98.96.68', '133.120.1.1', '192.168.1.22']
print(sorted(ip_list, key=lambda x: (int(x.split('.')[0]), int(x.split('.')[1]), int(x.split('.')[2]))))
ip_lst = sorted(ip_list, key=lambda x: (int(x.split('.')[0]), int(x.split('.')[1]), int(x.split('.')[2])))
for i in ip_lst:
print(i)
运行结果:
3、对ip地址进行分类
如:这儿按最后一位进行分类,写入不同的文件中。此处忽略对ip地址的排序。
示例代码:
ip_list = ['192.168.1.33', '10.5.2.4', '10.5.1.3', '202.98.96.68', '133.120.1.1', '192.168.1.22']
for ip in ip_list:
last_ip_num = ip.split('.')[-1]
with open('data/.{}.txt'.format(last_ip_num), 'a', encoding='utf-8') as f:
f.write(ip)
运行结果:
优化上述代码,当ip_list列表中有数以亿计的ip时,上述代码效率是非常低的,耗时主要在打开文件写数据方面,可以把每一类ip先暂时存储,最终一次性写入文件中。
示例代码:
ip_list = ['192.168.1.33', '10.5.2.33', '10.5.1.33', '202.98.96.1', '133.120.1.1', '192.168.1.1']
ip_dic_save = {}
for ip in ip_list:
last_ip_num = ip.split('.')[-1]
if f'.{last_ip_num}.txt' not in ip_dic_save:
ip_dic_save[f'.{last_ip_num}.txt'] = []
ip_dic_save[f'.{last_ip_num}.txt'].append(ip + ';')
else:
ip_dic_save[f'.{last_ip_num}.txt'].append(ip + ';')
print(ip_dic_save)
path = 'data/'
for key, value in ip_dic_save.items():
with open(path + key, 'a', encoding='utf-8') as f:
f.writelines(value)
运行结果:
如果数据量过大,ip_dic_save会占用较大内存,可以对字典中的每个key:value键值对进行判断,若value列表长度到达某个长度时,可以分批次写入到文件中。