AttributeError: у объекта 'str' нет атрибута 'readline' - PullRequest
4 голосов
/ 28 февраля 2009

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

Это задание, которое я выполняю и в настоящее время придерживаюсь. Имейте в виду, это класс программирования для начинающих, использующий 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, но мой код настроен на поиск только в первой строке. Как мне решить эту проблему?

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

Ответы [ 6 ]

3 голосов
/ 28 февраля 2009

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

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

Так что jargonFile.readline больше не имеет смысла

Обновить как ответ на комментарий:

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

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

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

Обновление II:

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

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 миллионов записей ... хорошо, вы бы использовали что-то более сложное, чем плоский файл в этом случае Но вы не можете загрузить его в память.)

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

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

==>

Hello
SD
How are you?

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

2 голосов
/ 28 февраля 2009

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

2 голосов
/ 28 февраля 2009

Хм, я вообще ничего не знаю о 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". Пример:

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: ")

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

2 голосов
/ 28 февраля 2009

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

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

Обновление:

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

1 голос
/ 28 февраля 2009

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

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

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

1 голос
/ 28 февраля 2009

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

...