【问题标题】:AttributeError: 'str' object has no attribute 'readline'AttributeError:“str”对象没有属性“readline”
【发布时间】:2009-02-27 22:15:25
【问题描述】:

更新:我目前的问题是如何让我的代码从每个新的搜索短语开始读取到 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,但我的代码设置为仅搜索第一行。我该如何解决这个问题?

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

【问题讨论】:

    标签: python file readline


    【解决方案1】:

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

    您需要注意您正在处理的对象(事物):open() 给您一个文件“行话”,行话上的 readline 给您字符串“行话文件”。

    所以 jargonFile.readline 不再有意义

    更新为评论的答案:

    好的,现在str错误问题已经解决了,考虑一下程序结构:

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

    您需要更改您的程序,使其遵循该描述

    更新二:

    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
    

    对于您的教授的额外加分,请在您的解决方案中添加一些 cmets,其中提及两种可能的解决方案,并说明您为什么选择您选择的解决方案。提示:在这种情况下,这是执行时间(内存很快)和内存使用量(如果您的行话文件包含 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?
    

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

    【讨论】:

    • 我已经修改了代码。样品运行中的错误仍然存​​在。在整个文件中都可以找到 searchPhrase “hack” (str)。我的问题是如何搜索整个文件,而不仅仅是第一行。感谢您的帮助。
    • 我可以看到您的结构将如何工作,但我必须使用启动结构来获得结果(多次重新打开文件是多余的,正如我的教授所说)。关于我发布的代码,我应该在第二个循环中寻找什么?
    • 内部循环遍历文件的行。目前,您只为每个术语检查一行。您必须全部检查。
    【解决方案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】:

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

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

      更新:

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

      【讨论】:

      • 我已经修改了代码。示例运行中的错误仍然存​​在。
      【解决方案4】:

      您不应该尝试重新发明轮子。只需使用 re module functions。 如果您使用以下方法,您的程序可能会运行得更好: 结果 = 行话.read() 。 代替: 结果 = 行话.readline() 。 那么你可以使用 re.findall() 函数 并加入您使用 str.join() 搜索的字符串(带有索引) 这可能会有点混乱,但如果需要一些时间来解决,这可以解决您的问题。 python文档有这个完美记录

      【讨论】:

      • 你有没有一个例子可以给我看?我很想尝试这种方式。
      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        查看文件对象的文档:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-09-10
          • 2021-10-04
          • 2019-12-02
          • 2021-09-25
          • 2014-03-04
          相关资源
          最近更新 更多