繁体   English   中英

在 Python 脚本中对 IP 地址进行排序

[英]Sorting IP Addresses in a Python Script

我正在尝试对正在读入 python 脚本并打印出来的 IP 地址进行排序。 我起草的代码读取并打印文件的内容(参见示例)

#!/usr/bin/python

f = open('file.txt', 'r')
file_contents = f.read()
print (file_contents)
f.close()

我的问题是如何导入 IP 地址并对它们进行正确排序? 在命令行中,我通常会通过一个简单的排序命令(sort -n -t . -k 1,1 -k 2,2 -k 3,3 -k 4,4 )传递文件。 但是,考虑到 IP 的每个八位字节的 0-255 编号模式,我怎样才能让 python 对它从文件中读取的 IP 进行排序,以便对输出进行正确排序?

谢谢,

您可以使用内置的ipaddress模块:

#!/usr/bin/python
import ipaddress

with open('file.txt', 'r') as f:
   ips = sorted(ipaddress.ip_address(line.strip()) for line in f)
   print('\n'.join(map(str, ips)))

如果您使用的是较旧的Python版本(3.3之前),则可能需要我的backport 另请注意,此代码使用文件I / O的with语句因为它正确处理错误

使用ipaddress ,实际上会测试IP地址的有效性。 此外,代码可以正确处理IPv6地址(即::1.2.3.4 > 000::12a0 )以及诸如2130706433深奥表示,尽管您不能混合使用IPv4和IPv6地址。

或者,您可以使用自然排序算法 这不会验证地址并且可能不正确,但只要您输入的是始终为1.2.3.4格式的IPv4地址,它就会起作用。

如果您不想使用任何外部软件并且想要一个紧凑的解决方案,您始终可以提供lambda函数作为排序键。

with open("ip.txt", "r") as infile:
    iplist = sorted([i.strip() for i in infile.readlines()], key = lambda x: int(''.join((lambda a:lambda v:a(a,v))(lambda s,x: x if len(x) == 3 else s(s, '0'+x))(i) for i in x.split('.'))))

假设ip.txt中的正常IPv4由换行符分隔。

生成的iplist是带有IP的排序列表。 您也可以将它们输出到文件,如下所示:

with open("ip.txt", "r") as infile:
    iplist = sorted([i.strip() for i in infile.readlines()], key = lambda x: int(''.join((lambda a:lambda v:a(a,v))(lambda s,x: x if len(x) == 3 else s(s, '0'+x))(i) for i in x.split('.'))))

with open("output.txt", "w") as outfile:
    outfile.write("\n".join(i for i in iplist))

输出文件可以与输入或不同的文件相同。

首先,根据您存储IP地址的方式,您可以将它们读入列表中。 您可以通过稍微修改当前在IP地址中读取的方式来执行此操作

with open('file.txt', 'r') as f:
    file_conents = f.readlines()

然后,您想要删除间距字符(例如列表项末尾的新行\\n

file_contents = [x.strip() for x in file_contents] 

现在您有了一个IP地址列表,您可以使用Pythons排序功能

file_contents.sort()
print("IP addresses: ", file_contents)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM