2009-02-27 90 views
4

更新:我目前的问题是如何让我的代码从一开始就从每个新的搜索短语开始读取到EOF。AttributeError:'str'对象没有属性'readline'

这是我正在做的工作,目前正在进行中。请注意,这是一个使用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),然后把它打印出结果(这是它发生的行和字符occurence)。我将使用计数器来查找出现的行号,但我会稍后再执行。现在我的问题是我得到的错误。我无法找到一种方法来搜索整个文件。

样品运行:

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

“狗”是在第一行中找到但是它也在(多次作为字符串)的jargonFile的其它系中发现但它仅示出了在第一次出现第一行。字符串破解在jargonFile中找到了很多次,但我的代码设置为只搜索第一行。我该如何解决这个问题?

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

回答

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

注意“与”自动关闭,当你完成的文件。

1

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

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

更新:

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

+0

我修改了代码。样品运行中的错误仍然存​​在。 – 2009-02-27 22:24:10

3

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

你需要小心你正在处理什么对象(东西):open()给了你一个文件“行话”,在专业术语readline给了你字符串“jargonFile”。

So jargonFile。readline的没有意义了

更新的答案评论:

好了,现在该海峡错误问题解决思考程序结构:

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

你需要改变你的程序,以便它遵循descripiton

更新II:

SD,如果你想避免重新打开文件你还是需要两个循环s,但是这次一个循环将文件读入内存,完成后第二个循环要求输入搜索词。所以,你会构建它像

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”, “公元前”]。你想使用后者,因为列表可以被修改(一个元组不能。)

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

==>

Hello 
SD 
How are you? 

好吧,去年例子包含了所有的新东西(定义列表,附加到列表,循环列表)为您的程序的第二个解决方案。玩得开心把它放在一起。

+0

我修改了代码。样品运行中的错误仍然存​​在。 searchPhrase“hack”(str)遍布整个文件。我的问题是如何搜索整个文件,而不仅仅是第一行。 谢谢你的帮助。 – 2009-02-27 22:25:06

+0

我已经更新了我的回答以回应您的评论。 – froh42 2009-02-27 22:36:11

1

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

1

看看该文档的文件对象:

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

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

2

你不应该试图重新发明轮子。只需使用 re module functions即可。 如果你使用了: result = jargon.read(),你的程序可以更好地工作。而不是: result = jargon.readline()。 然后你可以使用re.findall()函数 并加入你用str.join() 搜索的字符串(与索引),这可能会有点混乱,但如果需要一些时间来解决它,这可能会解决你的问题。 python文档有这个完美的文档