Строка за строкой:
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
всегда будет выдавать значение false (спасибо Стивену Румбальски за напоминание об этом).Используйте .strip()
(как предложено в ответе matchw), или, если вы можете допустить частичное совпадение, вы можете использовать простую функцию сопоставления подстрок Python: if chargeInput in line
.
else:
print chargeInput, 'not found in list.'
break
chargeFile.close
И здесь, как указал Сарнольд, вы неправильно назвали свой файл;Более того, он находится в совершенно другом блоке кода, что означает, что вы постоянно открываете файлы chargeAccount
, не закрывая ни один из них.
Как видно из поста matchw, есть гораздо более простой способ сделать то, что вы пытаетесь сделать.Но я думаю, что вам стоит разобраться, как правильно написать этот код в выбранном вами стиле.Я дам вам одну подсказку: внутри должен быть line = chargeAccount.readline()
самый внутренний цикл while.Вы понимаете почему?Кроме того, вы, вероятно, должны выйти из цикла, когда вы успешно нашли совпадение, а не когда вы потерпели неудачу.Затем вы должны подумать, как проверить, был ли поиск успешным после завершения самого внутреннего цикла.