AttributeError:'str'对象没有属性'readline'

时间:2009-02-27 22:15:25

标签: python file readline

更新:我目前的问题是如何让我的代码从每个新搜索词组开始读取到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:

“dog”在第一行中找到,但它也可以在jargonFile的其他行中找到(多次作为字符串),但它只显示第一行中的第一个出现。在jargonFile中发现了多次字符串hack,但我的代码设置为仅搜索第一行。我怎么能解决这个问题?

如果这个不够清楚,我可以在必要时发布作业。

6 个答案:

答案 0 :(得分:3)

首先打开文件并将其读入带有readline()的字符串。稍后,您尝试从第一步中获得的字符串中读取readline()。

你需要注意你正在处理的对象(事物):open()给你一个文件“行话”,行话上的readline给你字符串“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

对于您教授的额外积分,请在您的解决方案中添加一些评论,提及两种可能的解决方案,并说出您选择所做解决方案的原因。提示:在这种情况下,它是执行时间(内存很快)和内存使用之间的经典权衡(如果你的行话文件包含1亿个条目......那么,在这种情况下,你会使用比平面文件更复杂的东西,你不能把它加载到内存中。)

哦,还有一个提示第二个解决方案: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?

好的,最后一个示例包含程序的第二个解决方案的所有新内容(定义列表,附加到列表,循环列表)。尽情享受。

答案 1 :(得分:2)

您的文件是jargon,而不是jargonFile(字符串)。这可能是导致您的错误消息的原因。您还需要第二个循环来从头开始读取文件的每一行,直到找到您要查找的单词。您的代码当前停止搜索是否在文件的当前行中找不到该单词。

尝试编写只给用户一次机会输入字符串的代码怎么样?输入该字符串,搜索文件直到找到(或不找到)并输出结果。完成后,您可以返回并添加允许多次搜索的代码,并以空字符串结束。

<强>更新

为避免多次迭代文件,您可以通过将整个文件拖放到一个字符串列表中来启动程序,一次一行。查找文件对象的readlines方法。然后,您可以搜索每个用户输入的列表,而不是重新读取文件。

答案 2 :(得分: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”关键字。例如:

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”会在您完成后自动关闭文件。

答案 3 :(得分:2)

你不应该试图重新发明轮子。只是使用 re module functions。 如果您使用以下程序,您的程序可以更好 result = jargon.read()。 代替: result = jargon.readline()。 那么你可以使用re.findall()函数 并使用str.join()连接搜索到的字符串(带索引) 这可能会有点乱,但如果花一些时间来解决它,这可以解决你的问题。 python文档有完整的文档记录

答案 4 :(得分:1)

每当您输入搜索词组时,它会在下一行行中查找,而不是第一行。如果您希望它的行为与您描述的一样,则需要为每个搜索短语重新打开该文件。

答案 5 :(得分:1)

查看File对象的文档:

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

您可能对readlines方法感兴趣。对于文件不是很大的简单情况,您可以使用它将所有行读入列表。然后,每当您获得新的搜索字符串时,您都可以浏览整个列表以查看它是否存在。

相关问题