值错误:'10 .0.0.150'是无效的IP版本!'使用netaddr库

时间:2016-01-14 19:36:50

标签: python

我正在使用CSV模块以及netaddr。当我打印单行IP,同时将它们作为IP,然后作为int,它打印正常。当我用第一行打印第二行时,我得到一个错误,说“值错误:'10 .0.0.150'是一个无效的IP版本!'。

import csv
from netaddr import *
with open('DHCPranges.csv', 'rb') as csvfile:
        reader = csv.DictReader(csvfile)
        for row in reader:
            print(int(IPAddress(row['start_address*'], row['end_address*'])))

我的csv文件如下:

[Network]      [start_address*] [end_address*]
Chris's Network 10.0.0.1         10.0.0.150
John's Network  10.0.0.152       10.0.0.254

当我这样做时它会起作用:

import csv
from netaddr import *
with open('DHCPranges.csv', 'rb') as csvfile:
      reader = csv.DictReader(csvfile)
      for row in reader:
          print(int(IPAddress(row['start_address*'])))

2 个答案:

答案 0 :(得分:3)

print(int(IPAddress(row['start_address*'], row['end_address*'])))

您将两列都传递给IPAddress构造函数。但构造函数一次只需要一个IP。第二个参数是IP版本。因此,当您构造IPAddress对象时,它会尝试将结束地址解析为版本。这导致了这个问题。

您应该构造两个单独的IPAddress对象并将它们转换为整数,如下所示:

print(int(IPAddress(row['start_address*'])), int(IPAddress(row['end_address*'])))

你的第二个例子非常有效,因为那时你只传递一个,正是构造函数所期望的。

答案 1 :(得分:0)

仔细阅读您的代码。这就是为什么更简单和更短的表达式比较长的表达式更受欢迎的原因:它更容易正确地写入(和读取)。

试试这个:

raw_start_addr = row['start_address*']
start_addr = IPAddress(raw_start_addr)
packed_start_addr = int(start_addr)

raw_end_addr = row['end_address*']
end_addr = IPAddress(raw_end_addr)
packed_end_addr = int(end_addr)

print(packed_start_addr, packed_end_addr)

然后DRY

def convert(raw_addr):
    addr = IPAddress(raw_addr)
    packed_addr = int(addr)
    return pack_addr

packed_start_addr = convert( row['start_address*'] )
packed_end_addr = convert( row['end_address*'] )
print(packed_start_addr, packed_end_addr)

您的问题是您没有打印两个地址。您仍然只将一个值传递给print(),但由于引发的异常导致调用从未发生过。您将两个参数传递给IPAddress构造函数。这有着截然不同的意思!

已更新:在评论中澄清了问题,即IPAddress类来自netaddr库。

IPAddress class' constructor的文档显示第二个参数是定义地址格式的IP协议的版本。两个(当前)版本是4和6.因此,包含字符10.0.0.150的字符串不是IP协议的有效版本,因此无法作为IPAddress()的第二个参数。这也可以在tutorial you referenced in your comment where it shows IPv6 support

中看到