#python-2.7
#python-2.7
Вопрос:
Мне нужно сделать в значительной степени то, что a 'grep -i str file'
возвращает, но я целую вечность сталкивался с этой проблемой.
У меня есть функция под названием ‘siteLookup’, в которую я передаю два параметра: str ‘s’ и file_handle ‘f’. Я хочу а) определить, существует ли (единственное) вхождение строки (в этом примере site="XX001"
), и б) если найдено, взять строку, в которой она была найдена, и вернуть другое значение поля, которое я извлекаю из этой [найденной] строки, обратно вызывающему. (это поиск в формате csv). У меня периодически это работало, но затем оно перестало работать, и я не понимаю, почему.
Я перепробовал все различные опции «открыть», включая f.readlines и т. Д.
#example line: 'XX001,-1,10.1.1.1/30,By Location/CC/City Name/'
#example from lookupFile.csv: "XX001","Charleston","United States"
sf = open('lookupFile.csv')
def siteLookup(s, f):
site = s.split(',')[0].strip().upper()
if len(site) == 5:
f.seek(0)
for line in f:
if line.find(site)>=0:
city = line.split(',')[1].strip('"').upper()
return city
# else site not found
return -1
else: # len(site) != 5
return -1
city = siteLookup(line, sf)
print(city)
sf.close()
Я получаю нулевые совпадения в этом коде. (Я упростил этот пример кода до одного поиска). Я ожидаю получить обратно название города, которое соответствует 5-значному коду сайта — код сайта является первым полем в примере «строка».
Любая помощь очень ценится.
Ответ №1:
У вас return
неверный отступ — если то, что вы ищете, не найдено в первой строке, оно вернет -1 и не будет искать дальше.
Используется with open(...) as f:
для повышения безопасности вашего кода:
с помощью open(«lookupFile.csv»,»w») как f: f.write(«»»#пример из lookupFile.csv: «XX001», «Чарльстон», «Соединенные Штаты» «»»)
def siteLookup(s, f):
site = s.split(',')[0].strip().upper()
if len(site) == 5:
f.seek(0)
for line in f:
if site in line: # if site in line is easier for checking
city = line.split(',')[1].strip('"').upper()
return city
# wrongly indented - will return if site not in line
# return -1
# if too short or not found, return -1 - no need for 2 returns
return -1
line = 'XX001,-1,10.1.1.1/30,By Location/CC/City Name/'
with open('lookupFile.csv') as sf:
city = siteLookup(line, sf)
print(city)
Вывод:
CHARLESTON
Комментарии:
1. Спасибо — протестировано и подтверждено, что работает так, как нужно!