2009-02-27 111 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文檔有這個完美的文檔