将文本文件转换为列表时遇到了一些麻烦。 文本文件如下所示:
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
答案 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()
这是您开始遇到问题的地方。 readline
从chargeAccount
读取一行,并将其存储在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()
。你明白为什么吗?此外,当你成功找到匹配时,你可能应该退出循环,而不是在你失败时。那么你应该考虑一种方法来测试在最内层循环完成后搜索是否成功。