Python; чтение файла и поиск нужного текста - PullRequest
1 голос
/ 28 сентября 2010

Необходимо создать функцию с двумя параметрами, открываемым именем файла и шаблоном.

Шаблон будет строкой поиска.

Например. функция откроет предложение.txt, в котором есть что-то вроде «Быстрая коричневая лиса» (может содержать более одной строки)

Узор будет "коричневая лиса"

Таким образом, если найдено, то это должно вернуть номер строки и индекс символа, с которого начинается найденная строка. В противном случае верните -1. ​​

Поймай, я никогда раньше не программировал на python, поэтому не знаю синтаксис. Ранее кодировался в C, C #, Java, VB и т. Д.

EDIT:

..... Id

..... Имя

#

я намеревался написать код HW3 в качестве итерации или

вложенных итераций, которые явно индексируют символ

строка в виде массива; то есть индекс Python (), также известный как

Функция string.index () не разрешена для этой домашней работы.

#

filename = raw_input ('Введите имя файла:')

pattern = raw_input ('Введите шаблон:')

def findPattern (fname, pat):

Чтение одним целым фрагментом

filetext = open(fname).read()
if pat in filetext:
    print("Found it -- chunk")
else:
    print("Nothing -- chunk")

Чтение в построчно

for search in open(fname):
    if pat in search:
        print("Found it -- line")
    else:
        print("Nothing -- line")    

findPattern (имя файла, шаблон)

Ответы [ 2 ]

3 голосов
/ 28 сентября 2010

Вы можете смоделировать простой "grep" с оператором "in"

def grep(filename, pattern):
    for n,line in enumerate(open(filename)):
        if pattern in line:
             print line, n

Чтобы получить индекс, вы можете использовать str.index() или str.find()

1 голос
/ 28 сентября 2010

Вот очень простой grep. Вы можете взломать его, используя регулярные выражения довольно тривиально. с glob было бы намного сложнее. Кроме того, нужный вам код находится в диапазоне от grep до main, так что он может представлять больший интерес, чем пользовательский grep;)

def grep(filename, needle):
    with open(filename) as f_in:
        matches = ((i, line.find(needle), line) for i, line in enumerate(f_in))
        return [match for match in matches if match[0] != -1]

def main(filename, needle):
    matches = grep(filename, needle)
    if matches:
        print "{0} found on {1} lines in {2}".format(needle, len(matches), filename) 
        for line in matches:
            print "{0}:{1}:{2}".format(*line)
        return 1
    else:
        return -1

if __name__=='__main__':
    import sys
    filename = sys.argv[1]
    needle = sys.argv[2]
    return sys.exit(main(filename, needle))

Обратите внимание, что я не тестировал этот код, поэтому могут быть небольшие ошибки. Если он компилируется, он должен работать нормально.

Кроме того, вы должны сказать своему учителю, что сбой сигнализации с кодами возврата - это ужасный способ сделать что-то. Если вызывающая функция, которую вы собираетесь написать, должна знать, не найдено ли совпадений, она может просто проверить пустой список.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...