2009-02-27 3 views
4

Обновление: Мой текущий вопрос: как я могу получить свой код для чтения в EOF, начиная с начала с каждой новой фразой.AttributeError: объект 'str' не имеет атрибута 'readline'

Это задание, которое я выполняю и в настоящее время застрял. Имейте в виду, что это класс программирования новичков с использованием Python.

jargon = open("jargonFile.txt","r") 
searchPhrase = raw_input("Enter the search phrase: ") 
while searchPhrase != "": 
    result = jargon.readline().find(searchPhrase) 
    if result == -1: 
     print "Cannot find this term." 
    else: 
     print result 
    searchPhrase = raw_input("Enter the search phrase: ") 
jargon.close() 

Назначение должен взять searchPhrase пользователя и найти его в файле (jargonFile.txt) и затем распечатать результат (который является линия это произошло и вхождение символа). Я буду использовать счетчик, чтобы найти номер строки, но я буду реализовывать это позже. На данный момент мой вопрос - ошибка, которую я получаю. Я не могу найти способ поиска по всему файлу.

Пример запуска:

Enter the search phrase: dog 
16 
Enter the search phrase: hack 
Cannot find this term. 
Enter the search phrase: 

«собака» находится в первой линии, однако она также в других линиях jargonFile (несколько раз в виде строки), но это только показывает первое вхождение в первая строка. Строковый хак неоднократно встречается в jargonFile, но мой код настроен только для поиска в первой строке. Как я могу решить эту проблему?

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

ответ

2

Хмм, я ничего не знаю о Python, но мне кажется, что вы не итерируете все строки файла для введенной строки поиска.

Как правило, вам нужно сделать что-то вроде этого:

enter search string 
open file 
if file has data 
    start loop 
    get next line of file 
    search the line for your string and do something 

    Exit loop if line was end of file 

Так что для вашего кода:

jargon = open("jargonFile.txt","r") 
searchPhrase = raw_input("Enter the search phrase: ") 
while searchPhrase != "": 
    <<if file has data?>> 
     <<while>> 
     result = jargon.readline().find(searchPhrase) 
     if result == -1: 
      print "Cannot find this term." 
     else: 
      print result 
     <<result is not end of file>> 
    searchPhrase = raw_input("Enter the search phrase: ") 
jargon.close() 

Круто, сделал небольшое исследование на странице DNS, предоставленной и Python, случается, есть «с ключевым словом».Пример:

with open("hello.txt") as f: 
    for line in f: 
     print line 

Так другая форма вашего кода может быть:

searchPhrase = raw_input("Enter the search phrase: ") 
while searchPhrase != "": 
    with open("jargonFile.txt") as f: 
     for line in f: 
      result = line.find(searchPhrase) 
      if result == -1: 
       print "Cannot find this term." 
      else: 
       print result 
    searchPhrase = raw_input("Enter the search phrase: ") 

Обратите внимание, что «с» автоматически закрывает файл, когда вы закончите.

1

Ваш файл jargon, а не jargonFile (строка). Вероятно, это вызывает сообщение об ошибке. Вам также понадобится второй цикл, чтобы прочитать каждую строку файла с самого начала, пока не найдете искомое слово. В настоящее время ваш код останавливает поиск, если слово не найдено в текущей строке файла.

Как насчет того, чтобы написать код, который дает пользователю только один шанс ввести строку? Введите эту строку, найдите файл, пока не найдете его (или нет), и выведите результат. После того, как вы получите эту работу, вы можете вернуться и добавить код, который позволяет несколько поисков и заканчивается на пустой строке.

Update:

Чтобы избежать Итерируя файлов несколько раз, вы могли бы начать свою программу, прихлебывая весь файл в список строк, по одной строке за один раз. Посмотрите на метод объектов readlines. Затем вы можете выполнить поиск этого списка для каждого пользовательского ввода вместо повторного чтения файла.

+0

Я изменил код. Ошибка в пробе все же сохраняется. –

3

Сначала вы открываете файл и читаете его в строке с readline(). Позже вы попытаетесь прочитать строку() из строки, полученной на первом шаге.

Вам необходимо позаботиться о том, какой объект (предмет) вы обрабатываете: open() дал вам файл «жаргон», readline на жаргоне дал вам строку «jargonFile».

So jargonFile.Readline не имеет смысла в малейшей

Дополнение ответ на комментарий:

Хорошо, теперь, что ошибка проблема ул решается думать о структуре программы:

big loop 
    enter a search term 
    open file 
    inner loop 
    read a line 
    print result if string found 
    close file 

Вы должны были бы изменить ваш программа так следует, что descripiton

Update II:

SD, если вы хотите, чтобы избежать повторного открытия файла вы все еще нужны два цикла s, но на этот раз один цикл считывает файл в память, когда это делается, второй цикл запрашивает поисковый запрос. Таким образом, вы бы структурировать как

create empty list 
open file 
read loop: 
    read a line from the file 
    append the file to the list 
close file 
query loop: 
    ask the user for input 
    for each line in the array: 
     print result if string found 

Для получения дополнительных баллов из вашего профессора добавить некоторые комментарии к вашему решению, которое упоминается как возможные решения и сказать, почему вы выбрали тот, который вы сделали. Подсказка: в этом случае это классический компромисс между временем выполнения (оперативная память) и использованием памяти (что, если ваш файл жаргона содержит 100 миллионов записей ... нормально, вы использовали бы что-то более сложное, чем плоский файл в этом случае , bu вы не можете загрузить его в память.)

О, и еще один намек на второе решение: Python поддерживает кортежи («a», «b», «c») и перечисляет [«a», "До нашей эры"]. Вы хотите использовать последние один, потому что список может быть изменен (кортеж не может.)

myList = ["Hello", "SD"] 
myList.append("How are you?") 
foreach line in myList: 
    print line 

==>

Hello 
SD 
How are you? 

Хорошо, что последний пример содержит весь новый материал (определить список , добавить в список, перебрать список) для второго решения вашей программы. Получайте удовольствие, собирая все это вместе.

+0

Я изменил код. Ошибка в пробе все же сохраняется. SearchPhrase «hack» (str) найден через весь файл. Мой вопрос в том, как я могу найти весь файл, а не только первую строку. Благодарим вас за помощь. –

+0

Я обновил свой ответ в ответ на ваш комментарий. – froh42

+0

Я могу видеть, как ваша структура будет работать, но я должен использовать структуру прайминга для достижения результатов (повторное открытие файла mulitple times избыточно, как говорит мой профессор). Что я должен искать во втором цикле в отношении моего опубликованного кода? –

1

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

1

Посмотрите на документацию для объектов File:

http://docs.python.org/library/stdtypes.html#file-objects

Вы могли бы быть заинтересованы в методе readlines. Для простого случая, когда ваш файл не огромен, вы можете использовать его для чтения всех строк в списке. Затем, всякий раз, когда вы получаете новую строку поиска, вы можете просмотреть весь список, чтобы узнать, есть ли он там.

2

Вы не должны пытаться изобрести колесо. просто используйте re module functions. Ваша программа может работать лучше, если вы использовали: result = jargon.read(). вместо: result = jargon.readline(). , то вы можете использовать функцию re.findall() и присоединиться к строкам (с индексами), которые вы искали с помощью str.join() , это может стать немного грязным, но если потребуется некоторое время для его разработки, это может исправить вашу проблему. документация на python прекрасно документирована

+0

Есть ли пример, который вы можете мне представить? Я бы хотел попробовать это так. –

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