我正在尝试对IP地址进行排序,我将其读入python脚本并打印出来。我起草的代码读取并打印文件的内容(参见示例)
#!/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)。但是我如何让python对它从文件中读取的IP进行排序,以便输出正确排序,同时考虑到IP的每个八位字节的0-255编号模式?
谢谢,
答案 0 :(得分:5)
您可以使用内置的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之前),则可能需要my backport。另请注意,此代码使用with
statement作为文件I / O,as this handles errors correctly。
使用ipaddress
,实际测试IP地址的有效性。此外,代码可以正确处理IPv6地址(即::1.2.3.4 > 000::12a0
)以及诸如2130706433
之类的深奥表示,尽管您不能混合使用IPv4和IPv6地址。
或者,您可以使用natural sort algorithm。这不会验证地址并且可能不正确,但只要您输入1.2.3.4
形式的IPv4地址,就可以正常工作。
答案 1 :(得分:2)
如果您不想使用任何外部软件并且想要一个紧凑的解决方案,您可以随时提供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))
输出文件可以与输入或其他文件相同。
答案 2 :(得分:0)
首先,根据您存储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)