Поиск и сопоставление части строки в CSV-файле с использованием Python - PullRequest
1 голос
/ 04 августа 2011

Это часть большого CSV-файла, который у меня есть:

"66.35.223.128","66.35.223.143","1109647232","1109647247","AU","Australia"
"66.35.223.144","66.35.227.191","1109647248","1109648319","US","United States"
"66.35.227.192","66.35.227.207","1109648320","1109648335","JP","Japan"
"66.35.227.208","66.35.230.31","1109648336","1109648927","US","United States"
"66.35.230.32","66.35.230.47","1109648928","1109648943","AU","Australia"
"66.35.230.48","66.35.236.207","1109648944","1109650639","US","United States"
"66.35.236.208","66.35.236.223","1109650640","1109650655","AU","Australia"
"66.35.236.224","66.36.127.255","1109650656","1109688319","US","United States"

Первые два столбца представляют собой диапазон IP-адресов.У меня есть IP-адрес 66.35.250.168. Мне нужно найти файл csv, чтобы узнать, в каком диапазоне он находится, и распечатать соответствующее название страны.

Поскольку первые два числа (66,35) совпадаютЯ намерен искать строку, содержащую это.Я могу найти полную строку (66.35.205.88), выполнив это:

import csv
with open('GeoIPCountryWhois.csv', mode='r') as f:
    reader = csv.reader(f)
    for row in reader:
        if row[0] in ['66.35.205.88']:
            print row

Если я ищу 66.35, я не получаю никакого результата.Подскажите, пожалуйста, как я могу найти часть строки (здесь «66,35»)?Кроме того, вы можете сказать мне, как я могу найти точный номер строки, в которой я нахожу строку?

Заранее спасибо.

Ответы [ 3 ]

4 голосов
/ 04 августа 2011
import csv
with open('GeoIPCountryWhois.csv', mode='r') as f:
    reader = csv.reader(f)
    for num, row in enumerate(reader):
        if '66.35' in row[0]:
            print num, row

Имейте в виду, что это может дать вам ложные срабатывания, если '66.35' появляется в других местах адреса или в другом месте строки.

Редактировать: вот версия, которая может фактически проверить, является ли онав нужном диапазоне.

def numeric_ip(ip):
    return [int(x) for x in ip.split('.')]

desired_ip = numeric_ip('66.35.205.88')
with open('GeoIPCountryWhois.csv', mode='r') as f:
    for num, row in enumerate(csv.reader(f)):
        if numeric_ip(row[0]) <= desired_ip <= numeric_ip(row[1]):
            print num, row
1 голос
/ 04 августа 2011

Нет причин, по которым in не должен работать.

Убедитесь, что вы переключаете заказ

if '66.35' in row[0]:
    print row
0 голосов
/ 04 августа 2011

Вы можете использовать стандартные логические тесты со строками, чтобы проверить, находится ли искомый IP-адрес в диапазоне:

import csv

desired_ip = "66.35.232.56"
desired_ip_n = [str(n) for n in desired_ip.split(".")
with open('GeoIPCountryWhois.csv', mode='r') as f:
    reader = csv.reader(f)
    row_num = 1
    for row in reader:
        ip_start_n = [str(n) for n in row[0].split(".")]
        ip_end_n = [str(n) for n in row[1].split(".")]
        if desired_ip_n >= ip_start_n and desired_ip <= ip_end_n:
            print row
            print row_num
        row_num += 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...