我想验证可能包含错误格式化地址或其他垃圾的列表中的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)
答案 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)。
这可能是你在这里发生的事情的一部分。