从列表中验证IP地址

时间:2012-03-30 18:50:50

标签: python scripting csv ip

我想验证可能包含错误格式化地址或其他垃圾的列表中的IP地址。如果该字段不包含格式正确的字段,则只需继续忽略该字段。

Per How to validate IP address in Python?似乎有两种方法可以完成此任务,即REGEX或socket.inet_aton()

以下是尝试使用socket.inet_aton()解析CSV并检查字段是否为IPv4地址。目前它打印垃圾或没有正确格式化的IP地址。有关打印反向IP或IP是正确IP地址的提示吗?

更新

数字字段不是以离散的八位字节表示法打印,即12345打印。如何过滤掉非八位字符表示法?

for data in import_text('data.csv', ','):
    try:
        socket.inet_aton(data)
    except socket.error:
        continue
    print (data)

4 个答案:

答案 0 :(得分:3)

print语句位于“except”块中,因此只有在将传递的字符串解析为IP地址时才会调用它。

将for循环的内容更改为:

try:
    socket.inet_aton(data)
except socket.error:
    continue

print (data)

答案 1 :(得分:3)

如果没有发生异常,则执行else块的try/except子句。

try:
    socket.inet_aton(data)
except socket.error:
    pass
else:
    print(data)

但是因为你需要它表示为一个离散的八位字节,你最好的方法不是正则表达式,而不是socket.inet_aton,而是一个简单的验证函数:

def valid_ip(addr):
    try:
        addr = addr.strip().split(".")
    except AttributeError:
        return False
    try:
        return len(addr) == 4 and all(octet.isdigit() and int(octet) < 256
                                      for octet in addr)
    except ValueError:
        return False

然后就是:

if valid_ip(data):
    print data

答案 2 :(得分:1)

你应print致电后inet_aton()

for data in import_text('data.csv', ','):
    try:
        socket.inet_aton(data)
        # data is ok, otherwise a socket.error would have been raised
        print(data)
    except socket.error:
        continue # if you don't care about "garbage"

每当inet_aton被提供任何非有效IP socket.error时,控件就会转到except块。

答案 3 :(得分:1)

根据手册,inet_aton接受少于3个点的字符串:

  

inet_aton()也接受少于三个点的字符串;有关详细信息,请参见Unix手册页inet(3)。

这可能是你在这里发生的事情的一部分。