2011-05-23 27 views
0

我在將文本文件轉換爲列表時遇到了一些問題。 文本文件,提出這樣的:將文本文件轉換爲列表,然後讀取列表以確定條目是否在列表中

5658845 
4520125 
7895122 
8777541 
8451277 
1302850 
8080152 

我已經寫代碼,需要用戶輸入,並試圖確定用戶輸入是在列表中。然而,我在搜索列表時遇到了一些麻煩,因爲我只能得到列表中最後一個結果的結果,我會在哪裏出錯?

def accountReader(): 

    while True: 
     chargeInput = (raw_input ("Enter a charge account to be validated: ")) 
     if chargeInput == '': 
      break 
      sys.exit 


     else: 
      chargeAccount = open('charge_accounts.txt', 'r') 
      line = chargeAccount.readline() 
      while line != '': 
       if chargeInput == line: 
        print chargeInput, 'was found in list.'      
       else: 
        print chargeInput, 'not found in list.' 
        break   


    chargeFile.close 
+2

最後關閉了'chargeFile',但從未打開; 'chargeAccount'已打開但從未關閉。這真的是你遇到問題的代碼嗎? :)試圖調試重新輸入問題並不是很有趣。複製粘貼是國王。 :) – sarnold 2011-05-23 01:56:33

+0

哦,抱歉大腦現在有點糊塗,一直在用這個代碼圈起來,它有點砍,因爲我嘗試了替代解決方案而改變了。該chargefile.close實際上是chargeAccount.close在我的代碼 – Robocop 2011-05-23 02:03:52

回答

2

一條線,由線故障:

def accountReader(): 

    while True: 
     chargeInput = (raw_input ("Enter a charge account to be validated: ")) 
     if chargeInput == '': 
      break 
      sys.exit 

好了,到目前爲止,一切順利。您創建了一個循環,該循環反覆詢問用戶輸入並在用戶輸入任何內容時中斷。

 else: 
      chargeAccount = open('charge_accounts.txt', 'r') 
      line = chargeAccount.readline() 

這裏是你開始遇到問題的地方。 readlinechargeAccount中讀取一行並將其存儲在line中。這意味着你只能測試一行!

  while line != '': 
       if chargeInput == line: 
        print chargeInput, 'was found in list.' 

這會進一步影響您的問題。如果chargeInput == line,那麼這將打印一條消息,然後循環重複。由於沒有什麼可以跳出循環,這將導致一個無限循環,不斷測試文件中的一行。另外,由於文件中的每行都以換行符結尾(\n),因此chargeInput == line將始終產生錯誤(感謝Steven Rumbalski提醒我這一點)。使用.strip()(如matchw的答案中所示),或者,如果您可以容忍部分匹配,則可以使用Python的簡單子字符串匹配功能:if chargeInput in line

   else: 
        print chargeInput, 'not found in list.' 
        break   


    chargeFile.close 

在這裏,正如sarnold指出的,你錯誤地命名了你的文件;此外,它處於完全不同的代碼塊中,這意味着您可以反覆打開chargeAccount文件而不關閉任何文件。

正如你從matchw的帖子中看到的,有一種更簡單的方式來做你想做的事情。但是我認爲你應該好好弄清楚如何以你選擇的風格正確編寫代碼。我會給你一個提示:裏面應該有一個line = chargeAccount.readline()最內層while循環。你明白爲什麼?此外,當你在成功找到一個匹配,而不是失敗時,你應該退出循環。那麼你應該考慮一種方法來測試在最內層循環完成後搜索是否成功。

+2

一個額外的問題。 'line'以換行符結束,而chargeInput不會,這意味着即使他比較每個值,它們也不會是匹配。 – 2011-05-23 03:43:34

+0

@Steven Rumbalski,謝謝你提醒我。 – senderle 2011-05-23 04:14:40

2

我會讀列表這樣

chargeAccount = open('charge_accounts.txt', 'r') 
accts = [line.strip() for line in chareAccount] 

if chareInput in accts: 
    #do something 
else: 
    #do something else 

起碼.strip()關閉的ReadLine(),您的線路可能看起來像 '5658845 \ n'

更新

所以經過測試你有我的修改它的工作原理....除了它重複indef做的同時acct!=''

這裏是我改變

chargeAccount = open('charge_accounts.txt', 'r') 
    accts = [line.strip() for line in chargeAccount] 
    while accts != '': 
    if chargeInput in accts: 
     #... 

我將完全拋棄while循環,它無論是在列表或它不是。無需在每條線上循環。

相關問題