Подтвердите IP-адрес из списка - PullRequest
0 голосов
/ 30 марта 2012

Я хотел бы проверить IP-адреса из списка, который может содержать неправильно отформатированные адреса или другой мусор.Если поле не содержит правильно отформатированного поля, просто продолжайте игнорировать это поле.

Per Как проверить IP-адрес в Python? кажется, что есть два метода, два для достижения этой цели, REGEXили socket.inet_aton().

Ниже приведена попытка использовать socket.inet_aton() для анализа CSV и проверки поля, если это адрес IPv4.В настоящее время он печатает мусор или неправильно отформатированные IP-адреса.Любые советы по печати обратных или IP, которые являются правильными IP-адресами?

Обновление

Числовые поля не печатаются в дискретной записи октета, то есть 12345 отпечатков.Как можно отфильтровать неоктетную нотацию?

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

Ответы [ 4 ]

3 голосов
/ 30 марта 2012

Предложение 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
3 голосов
/ 30 марта 2012

Оператор print находится в блоке "кроме", поэтому он вызывается только в случае ошибки синтаксического анализа переданной строки в качестве IP-адреса.

Измените содержимое цикла for следующим образом:

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

print (data)
1 голос
/ 30 марта 2012

Согласно инструкции, inet_aton принимает строки длиной менее 3 точек:

inet_aton () также принимает строки длиной менее трех точек; см. подробности в справочной странице Unix (3).

Это может быть частью того, что происходит с вами здесь.

1 голос
/ 30 марта 2012

Вы должны 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.

...