首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AttributeError:'str‘对象没有属性'readline’

AttributeError:'str‘对象没有属性'readline’
EN

Stack Overflow用户
提问于 2009-02-27 22:15:25
回答 6查看 35.1K关注 0票数 4

更新:我当前的问题是如何让我的代码从每一个新的搜索短语开始读到EOF。

这是一个任务,我正在做,目前仍在坚持。请注意,这是一个初学者使用Python编程的课程。

代码语言:javascript
复制
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)中找到它,然后让它打印结果(这是它发生的行和出现的字符)。我将使用一个计数器来查找发生的行号,但我稍后会实现这一点。现在我的问题是我所犯的错误。我找不到办法让它搜索整个文件。

样本运行:

代码语言:javascript
复制
Enter the search phrase: dog
16
Enter the search phrase: hack
Cannot find this term.
Enter the search phrase:

在第一行中可以找到"dog“,但是它也存在于jargonFile的其他行中(以字符串的形式多次出现),但它只显示了第一行中的第一次出现。字符串黑客在jargonFile中被发现了很多次,但是我的代码被设置为只搜索第一行。我该如何解决这个问题呢?

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

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-02-28 00:21:41

嗯,我对Python一无所知,但在我看来,您并没有遍历输入的搜索字符串的所有文件行。

通常,您需要这样做:

代码语言:javascript
复制
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

因此,对于您的代码:

代码语言:javascript
复制
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“关键字。示例:

代码语言:javascript
复制
with open("hello.txt") as f:
    for line in f:
        print line

因此,代码的另一种形式可能是:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2009-02-27 22:21:22

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

您需要注意您正在处理的对象(事物):open()给了您一个文件“专业术语”,在行话上的读行给了您字符串"jargonFile“。

所以jargonFile.readline不再有意义了

作为对评论的答复,更新:

好了,既然str错误问题已经解决了,请考虑程序结构:

代码语言:javascript
复制
big loop
  enter a search term
  open file
  inner loop
     read a line
     print result if string found
  close file

您需要更改您的程序,以便按照下面的描述

最新情况二:

SD,如果您想避免重新打开文件,您仍然需要两个循环,但这一次有一个循环将文件读入内存,当这样做时,第二个循环将请求搜索项。所以你会把它构造成

代码语言:javascript
复制
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“。您希望使用后一种方法,因为列表可以修改(元组不能)。

代码语言:javascript
复制
myList = ["Hello", "SD"]
myList.append("How are you?")
foreach line in myList:
    print line

==>

代码语言:javascript
复制
Hello
SD
How are you?

好的,最后一个例子包含了程序第二个解决方案的所有新内容(定义列表、追加列表、循环遍历列表)。把这些都放在一起玩得很开心。

票数 3
EN

Stack Overflow用户

发布于 2009-02-27 22:20:13

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

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

更新:

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/596886

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档