Преобразование текстового файла в список, а затем чтение списка, чтобы определить, находится ли запись в списке - PullRequest
0 голосов
/ 23 мая 2011

У меня небольшие проблемы с преобразованием текстового файла в список. текстовый файл представлен так:

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 ]

2 голосов
/ 23 мая 2011

Строка за строкой:

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.Вы понимаете почему?Кроме того, вы, вероятно, должны выйти из цикла, когда вы успешно нашли совпадение, а не когда вы потерпели неудачу.Затем вы должны подумать, как проверить, был ли поиск успешным после завершения самого внутреннего цикла.

2 голосов
/ 23 мая 2011

я бы прочитал список вот так

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'

ОБНОВЛЕНИЕ

поэтому после тестирования того, что у вас есть с моей модификацией, оно работает .... за исключением того, что оно повторяет неопределенное действие в то время как acct! = ''

вот что яизменено

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

Я бы вообще отказался от цикла while, он либо в списке, либо его нет.нет необходимости циклически проходить через каждую строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...