代码之家  ›  专栏  ›  技术社区  ›  SD.

AttributeError:“str”对象没有属性“readline”

  •  4
  • SD.  · 技术社区  · 16 年前

    这是我正在做的一项任务,目前仍在继续。请注意,这是一个使用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()
    

    任务是获取用户的搜索短语并在文件(jargonFile.txt)中找到它,然后让它打印结果(它出现的行和字符出现的行)。我将使用计数器来查找发生的行号,但我将在稍后实现。现在我的问题是我所犯的错误。我找不到方法让它搜索整个文件。

    样本运行:

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

    “dog”出现在第一行,但它也出现在行话文件的其他行中(多次作为字符串出现),但它仅显示第一行中的第一个出现。字符串hack在行话文件中被多次发现,但我的代码设置为只搜索第一行。我如何着手解决这个问题?

    如果这还不够清楚,我可以张贴作业,如果需要的话。

    6 回复  |  直到 12 年前
        1
  •  3
  •   Ned Batchelder    15 年前

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

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

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

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

    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亿个条目……好吧,在这种情况下,您可能会使用比平面文件更复杂的内容,但您也无法将其加载到内存中。)

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

    ==>

    Hello
    SD
    How are you?
    

    好的,最后一个例子包含程序第二个解决方案的所有新内容(定义列表、附加到列表、循环列表)。把它们放在一起玩得开心。

        2
  •  2
  •   Rake36    16 年前

    通常,您需要执行以下操作:

    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
  •   Michael Kristofik    16 年前

    你的档案是 jargon jargonFile

    更新:

    为了避免多次迭代该文件,可以通过将整个文件拖入字符串列表(一次一行)来启动程序。查阅 readlines

        4
  •  2
  •   Tim van laar Tim van laar    16 年前

    你不应该试图重新发明轮子。只要使用 re module functions . 如果您使用以下选项,您的程序可能会运行得更好: result=jargon.read()。 而不是: result=jargon.readline()。 然后可以使用re.findall()函数 并将使用str.join()搜索的字符串(与索引)连接起来 python文档完美地记录了这一点

        5
  •  1
  •   muratgu    16 年前

    每次您输入搜索短语时,它都会在 下一个 行,不是第一行。如果您想让每个搜索短语的行为与您描述的一样,您需要重新打开该文件。

        6
  •  1
  •   DNS    16 年前

    查看文件对象的文档:

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

    你可能对这本书感兴趣 readlines