2010-09-28 3 views
0

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

Образец будет поисковой строкой.

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

картина будет «коричневая лиса»

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

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

EDIT:

..... Id

..... Имя

#

мое намерение был для вас, чтобы написать Hw3 код как итерация или

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

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

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

#

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

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

Защиту findPattern (имя_файла, пат):

чтения в одном весь кусок

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 (имя файла, шаблон)

+0

вы должны установить Linux и использовать Grep. – aaronasterling

+0

Или используйте опцию поиска в файлах в компетентном текстовом редакторе. Или лучше, сделай и то, и другое! – JoshD

+0

Это вопрос, связанный с назначением, а не что-то, что мне нужно сделать, и может быть открыт для опций. Linux + grep Желаю –

ответ

1

Вот очень простой 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)) 

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

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

+0

Является ли это python 3.0 или 2.x? – JoshD

+0

@JoshD, это должно быть и то, и другое. – aaronasterling

+0

Ах, я просто не узнал ключевое слово. Думаю, я должен использовать это ... Кроме того, отличный ответ! +1 – JoshD

2

вы можете имитировать простой "Grep" с "в" оператора

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

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

+0

У меня был бы профиль, чтобы быть уверенным, но я думаю, что использование 'in' и _then_' index' просто не будет таким быстрым, как использование 'find' и получение его. – aaronasterling

+0

Ну, если вы используете find(), то только получите номер позиции. Его не собирается распечатывать линию, где найден шаблон. Во всяком случае, я уже упоминал, что функция только имитирует простой grep. – ghostdog74

+0

Мне нужно сделать это без grep. Я просто просматривал документы python по регулярным выражениям http://docs.python.org/library/re.html, но не знаю, что я буду использовать. Здесь я нахожусь, используя как чтение текста в целом, так и по строке. Однако по строке будут читать оба и ответить на оба. Таким образом, он может и будет публиковать как «найденный» для первой строки, так и «ничего», потому что он все еще читает вторую строку. Проверить править для кода –

Смежные вопросы