简体   繁体   English

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

[英]Searching and Matching a part of a string in a CSV file using Python

This is a part of a large csv file which I have: 这是我拥有的大型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"

The first two columns are a range of IP addresses. 前两列是IP地址范围。 I have an IP address 66.35.250.168 I need to search the csv file to see in which range it lies, and print out the corresponding country name. 我的IP地址为66.35.250.168,我需要搜索csv文件以查看其位于哪个范围内,并打印出相应的国家/地区名称。

Since the first two numbers (66,35) are the same, I intend to search for the line containing this. 由于前两个数字(66,35)是相同的,因此我打算搜索包含该数字的行。 I can search a complete string(66.35.205.88) by doing this: 我可以通过执行以下操作搜索完整的字符串(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

If I search for 66.35, I don't get any result . 如果我搜索66.35,则不会得到任何结果。 Can you please tell me a way in which I can search for a part of the string ('66.35' here) ? 您能告诉我一种搜索字符串一部分的方法吗(此处为'66 .35')? Also, can you tell me how I can find the exact line number in which I find the string? 另外,您能告诉我如何找到在其中找到字符串的确切行号吗?

Thanks in advance. 提前致谢。

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

Keep in mind this can give you false positives if '66.35' appears at other locations in the address or elsewhere in the line. 请记住,如果“ '66.35'出现在地址的其他位置或该行的其他位置,则可能给您带来误报。

Edit: Here is a version that can actually check if it's in the right range. 编辑:这是一个可以实际检查它是否在正确范围内的版本。

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

There is no reason in shouldn't work. 没有理由in不应该工作。

Make sure you switch the order 确保您切换顺序

if '66.35' in row[0]:
    print row

You can use standard boolean tests with strings to check if the ip you're looking for is in the range: 您可以对字符串使用标准布尔测试,以检查您要查找的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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM