【问题标题】:How to sort ip addresses in csv file using python3如何使用python3对csv文件中的IP地址进行排序
【发布时间】:2021-11-30 06:57:03
【问题描述】:

我有一个如下所示的 csv 文件:

IP Address,Port,Protocol,State
192.168.3.1,53,tcp,open
192.168.13.100,80,tcp,open
192.168.3.1,443,tcp,close
192.168.3.71,1080,tcp,open
192.168.3.7,8888,tcp,open
192.168.23.12,80,tcp,filtered
192.168.3.12,443,tcp,open
192.168.3.12,631,tcp,open

如何在 python 3 中按 ip 地址和端口号对其进行排序?

我试过用这个:

#!/bin/python3
# import modules 
import csv, ipaddress
  
data = csv.reader(open('list.csv'),delimiter=',')
  
data = sorted(data, key = ipaddress.IPv4Address)    
  
print('After sorting:')
print(data)

但我有一个ipaddress.AddressValueError: Only decimal digits permitted in "['192" in "['192.168.3.1', '53', 'tcp', 'open']"

按ip地址排序后,代码应该检查端口,因为有可能相同的ip地址但不同的端口。

一个多星期以来一直试图解决这个问题。谢谢。

【问题讨论】:

  • 我不推荐这种提取数据的方法,因为数据现在将包含标题行,这使得排序有点奇怪。如果您需要另外按端口排序,您可能需要从套接字导入以允许您使用socket.getservbyname() 对端口进行数字排序

标签: python csv sorting ip-address


【解决方案1】:

第一个问题是来自 csv 阅读器的数据包含标题行。要跳过第一行,只需从阅读器中读取一行,然后再执行其他操作。

data = csv.reader(open('list.csv'),delimiter=',')
next(data) # Consumes the header line

data = sorted(...)

旁注:使用with 以便在您退出with 块时自动关闭文件。

with open('list.csv') as file:
    data = csv.reader(file)
    next(data)
    data = sorted(...)

现在,key 参数接受一个函数,并将您要排序的可迭代对象的每个元素 传递给该函数。现在您的 data 是一个可迭代的,其中每个元素都是一个 list 代表 csv 文件的每一行。你不想为每一行传递整个列表,你只想传递所述列表的第一个元素。您可以使用lambda expression 作为获取每个列表的键,并且只将第一个元素传递给ipaddress.IPv4Address

data = sorted(data, key = lambda row: ipaddress.IPv4Address(row[0]))

由于您还想按端口排序,您可以让 lambda 返回一个包含 IP 地址和端口号的元组。

data = sorted(data, key = lambda row: (ipaddress.IPv4Address(row[0]), row[1]))

如果您将第一列转换为 data 本身中的 IPv4Address 对象,您可能会发现它很有用,以便您可以在其他地方使用它们。在这种情况下,请逐行读取您的 csv 文件并在对其进行排序之前执行此操作。

with open('list.csv') as file:
    reader = csv.reader(file)
    next(reader)
    data = []
    for row in reader:
        row[0] = ipaddress.IPv4Address(row[0])
        data.append(row) 

    data.sort()

在这里,您不需要使用 lambda 函数,因为列表比较会自动比较第一个元素,然后是第二个元素,依此类推,并且行的元素已经是正确的比较类型。

【讨论】:

  • 这一定是我找到的关于此事的最佳解释之一。我试过你的代码,它确实对 IP 地址进行了排序。非常感谢您的帮助。
  • 很高兴您发现它有帮助。干杯!
猜你喜欢
  • 2022-10-09
  • 2021-10-07
  • 2012-11-25
  • 2011-09-09
  • 1970-01-01
  • 1970-01-01
  • 2011-10-02
  • 2016-03-04
  • 1970-01-01
相关资源
最近更新 更多