使用Python在CSV文件中搜索和匹配字符串的一部分

1 投票
3 回答
14543 浏览
提问于 2025-04-16 22:55

这是我拥有的一个大型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文件中查找这个IP地址属于哪个范围,并打印出对应的国家名称。

因为前两个数字(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 个回答

0

你可以用普通的布尔测试来检查字符串,看看你想要的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
1

没有理由说 in 不应该工作。

确保你把顺序调换一下。

if '66.35' in row[0]:
    print row
5
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
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

请记住,如果'66.35'出现在地址的其他地方或者行的其他位置,这可能会导致错误的判断。

补充:这里有一个版本,可以真正检查它是否在正确的范围内。

撰写回答