Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python搜索和匹配CSV文件中字符串的一部分_Python_String_File_Parsing_Csv - Fatal编程技术网

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

使用Python搜索和匹配CSV文件中字符串的一部分,python,string,file,parsing,csv,Python,String,File,Parsing,Csv,这是我拥有的大型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

这是我拥有的大型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,我不会得到任何结果。 你能告诉我一种搜索字符串某一部分的方法吗? 另外,你能告诉我怎样才能找到字符串所在的准确行号吗


提前感谢。

中的
没有理由不起作用

你一定要改变顺序

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

没有理由认为中的
不起作用

你一定要改变顺序

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

您可以使用带字符串的标准布尔测试来检查您要查找的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
导入csv
所需的_ip=“66.35.232.56”
所需_ip_n=[str(n)表示所需_ip.split(“.”)中的n)
将open('GeoIPCountryWhois.csv',mode='r')作为f:
读卡器=csv。读卡器(f)
行数=1
对于读取器中的行:
ip_start_n=[str(n)表示第[0]行中的n]。拆分(“.”)
ip_end_n=[str(n)表示第[1]行中的n]。拆分(“.”)

如果所需的\u ip\u n>=ip\u start\n和所需的\u ip可以使用带字符串的标准布尔测试来检查您要查找的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
导入csv
所需的_ip=“66.35.232.56”
所需_ip_n=[str(n)表示所需_ip.split(“.”)中的n)
将open('GeoIPCountryWhois.csv',mode='r')作为f:
读卡器=csv。读卡器(f)
行数=1
对于读取器中的行:
ip_start_n=[str(n)表示第[0]行中的n]。拆分(“.”)
ip_end_n=[str(n)表示第[1]行中的n]。拆分(“.”)
如果需要\u ip\u n>=ip\u启动\u n和所需的\u ip
请记住,如果
'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
def数字_ip(ip):
返回[ip.split('.')中x的int(x)]
所需ip=数字ip('66.35.205.88')
将open('GeoIPCountryWhois.csv',mode='r')作为f:
对于num,枚举(csv.reader(f))中的行:
如果是数字ip(第[0]行)
请记住,如果
'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
def数字_ip(ip):
返回[ip.split('.')中x的int(x)]
所需ip=数字ip('66.35.205.88')
将open('GeoIPCountryWhois.csv',mode='r')作为f:
对于num,枚举(csv.reader(f))中的行:

如果数字ip(第[0]行)获取行号相对容易。请尝试将第四行更改为
作为行号,在enumerate(reader)中的第行:
您解决此问题的整个方法都是不足的。您要做的是解析整个CSV文件以创建数据结构,然后使用数据结构。“行号”将从索引隐含到行结构列表中。您可以使用
namedtuple
来表示每一行。是的,这正是我想要做的。我想要行号只是为了参考,因为我有一个非常大的文件。获取行号相对容易。尝试将第四行更改为
对于行号,在e中的行numerate(reader):
您解决该问题的整个方法都不足。您要做的是解析整个CSV文件以创建数据结构,然后使用该数据结构。“行号”将从索引隐含到行结构列表中。您可以使用
namedtuple
来表示每一行。是的,这正是我想要做的。我想要行号只是作为参考,因为我有一个非常大的文件。不是……这是在测试列表是否在第[0]行中。您需要测试字符串是否在第[0]行中。是的,第[0]行['66.35']有效。切换意味着在字符串中搜索列表。如果搜索'66.35',则不会得到任何输出。否…这是在测试列表是否在第[0]行中。您需要测试字符串是否在第[0]行中。是的,['66.35'中的第[0]行有效。切换的意思是搜索字符串中的列表。如果搜索“66.35”,我不会得到任何输出。我不这么认为……这不是数字顺序,所以
200
的排序将小于
30
。是的,我刚刚捕捉到了。但我想你可以进行拆分(“.”)在所需ip和定义范围的ip上,然后比较结果列表…我不这么认为…这不是数字排序,因此
200
的排序将小于
30
。是的,我刚刚发现了这一点。但我认为您可以进行拆分(“.”)在所需ip和定义范围的ip上,然后比较结果列表…我只需更改“我只需更改”