簡體   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