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

时间:2011-05-23 01:48:59

标签: python list text

将文本文件转换为列表时遇到了一些麻烦。 文本文件如下所示:

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 个答案:

答案 0 :(得分: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'

更新

所以在测试你的修改之后它会起作用....除了它重复对while acct执行indef!=''

这是我改变的内容

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

我会完全放弃while循环,它可以在列表中,也可以不在。无需循环每一行。

答案 1 :(得分: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  

在这里,正如萨诺德指出的那样,你错误地命名了你的文件;此外,它是一个完全不同的代码块,这意味着您重复打开chargeAccount文件而不关闭它们中的任何一个。

从matchw的帖子中可以看出,有一种更简单的方法可以做你想做的事情。但我认为你应该弄清楚如何以你选择的风格正确编写这段代码。我会给你一个提示:在最里面的while循环里面应该有一个line = chargeAccount.readline() 。你明白为什么吗?此外,当你成功找到匹配时,你可能应该退出循环,而不是在你失败时。那么你应该考虑一种方法来测试在最内层循环完成后搜索是否成功。