使用Python搜索和匹配CSV文件中字符串的一部分
这是我拥有的大型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
"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上,然后比较结果列表…我只需更改“我只需更改”