将文本文件转换为列表,然后读取列表以确定条目是否在列表中

问题描述:

我在将文本文件转换为列表时遇到了一些问题。 文本文件,提出这样的:将文本文件转换为列表,然后读取列表以确定条目是否在列表中

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

一条线,由线故障:

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

我会读列表这样

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循环,它无论是在列表或它不是。无需在每条线上循环。