4

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

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

4

6 回答 6

3

首先,您打开文件并使用 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

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

更新二:

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?

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

于 2009-02-27T22:21:22.893 回答
2

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

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

更新:

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

于 2009-02-27T22:20:13.210 回答
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”会在您完成后自动关闭文件。

于 2009-02-28T00:21:41.513 回答
2

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

于 2009-02-28T13:14:32.967 回答
1

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

于 2009-02-27T22:31:55.630 回答
1

查看 File 对象的文档:

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

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

于 2009-02-27T22:33:56.937 回答