Поиск строки в файле с помощью python

#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. Спасибо — протестировано и подтверждено, что работает так, как нужно!