2013-10-15 6 views
1

Итак, у меня есть следующий фрагмент кода в python, который в основном открывает текстовый файл, делает массив из текстового содержимого файла (разделяя его по строкам), а затем переходит к вводу из пользователя и сравнить этот ввод с каждым из членов массива. Несмотря на то, что строка, указанная пользователем, находится в массиве, точно так же, как она была напечатана, программа не может сказать, что две строки равны. Как сравнить строки? И если эти обозначения верны, что может быть причиной неравенства? Я попытался заменить «is» на «==», но это тоже не сработало.Сравнение строк в Python не работает

как вход для userinput является frogeyedpeas и UserArray[0] является frogeyedpeas

Файл Usernames.txt

frogeyedpeas 
vsauce 

(есть дополнительная линия, которая является полностью пустым после канала Vsauce)

Код Написал ниже:

Usernames = open('Usernames.txt', 'r+') 
UserArray = Usernames.read().split("\n") 

userinput = raw_input("Enter Username: ") 
passinput = raw_input("Enter Password: ") 
i = 0 
q = len(UserArray) 
while(i < q): 
    founduser = 0 
    print userinput, UserArray[i], UserArray #out 

    if(UserArray[i] == userinput): 
     founduser = 1 
     if(PassArray[i] == passinput): 
      userstatus = i 
      founduser = 2 
    i = i + 1 
+0

Редактировать пост и добавить содержимое «Usernames.txt» –

+1

Что 'печать предст (UserInput), repr (UserArray [i]) 'print? –

+2

'UserArray [i] является userinput', [сначала узнайте об операторе' is'] (http://stackoverflow.com/questions/2438667/what-is-the-semantics-of-is-operator-in-python) , –

ответ

1

Ну, вы пытаетесь вырваться из цикла, если founduser равно 1, чтобы проверить, что он работает? Этот кусок кода обнаружил, что пользователь сбросил каждый раз, когда он запускает код внутри цикла while. Может быть, сказать (i < q и founduser! = 1) как заголовок цикла?

+0

bingo. это была проблема, спасибо! – frogeyedpeas

3

Вы тестируете идентичности объекта:

UserArray[i] is userinput: 

вы действительно хотите использовать равенство вместо:

UserArray[i] == userinput: 

is тесты, если две объектные ссылки указывают на тот же объект. == проверяет, эквивалентны ли значения двух объектов.

Две строки, которые имеют такое же содержание (равны), не обязательно один и тот же объект:

>>> spam = 'foo bar baz' 
>>> ham = 'foo bar baz' 
>>> spam is ham 
False 
>>> spam == ham 
True 
>>> eggs = ham 
>>> eggs is ham 
True 

CPython делает использовать некоторые приемы, чтобы сохранить память и повысить производительность, где небольшие целые числа и некоторые строки являются интернированных; каждый раз, когда вы пытаетесь создать новую строку или целое число, которое интернировано, вместо нового объекта вы получаете уже кэшированное значение. В этих случаях is тестов возвращает Trueтолько, потому что у вас действительно есть тот же объект, который повторно используется для вас переводчиком.

Обратите внимание, что тест равенства по-прежнему может быть неправильным. Там могут быть дополнительные пробелы вокруг значений, или другие символы, которые не сразу видно, когда выводятся на экран:

>>> val1 = 'frogeyedpeas' 
>>> val2 = 'frogeyedpeas\t' 
>>> val1 == val2 
False 
>>> print val1, val2 
frogeyedpeas frogeyedpeas 
>>> print repr(val1), repr(val2) 
'frogeyedpeas' 'frogeyedpeas\t' 
+0

== Не работает – frogeyedpeas

+0

@frogeyedpeas: Затем напечатайте 'repr()' представления и посмотрите внимательно. 'is' is * определенно * неверно, но это могут быть значения, которые не соответствуют. –

+0

значения соответствуют, так или иначе даже несмотря на то, что это правда, цикл не выполняется, как предполагалось, – frogeyedpeas

2

Try:

UserArray[i].strip(' \n') == userinput.strip(' \n') 

Как ваши методы ввода различны, и вы можете иметь конечные пробелы или символы новой строки в одном, а не другой.

1

Этого должно быть достаточно:

#What to look for. 
x=raw_input("Test for: ") 

#Read and split list. 
f=open('usernames.txt','r') 
y=f.read() 
y=y.split(',') 
f.close() 

#Test if the input is in list. 
#If it is, tell what the match is. 
for user in y: 
    if str(x)==str(user): 
     print x+'='+user 

И формат 'username.txt' идет как так:

Vsauce, frogeyedpeas

Позвольте мне знать, как она идет.

1

После копирования кода, создавая новый текстовый файл со словом «frogeyedpeas» и используя == вместо is, код действительно работает. Для того, чтобы очистить его, вы можете захотеть использовать for петлю и заархивировать два массива вместе, как это:

for name, password in zip(UserArray, PassArray): 
    print userinput, name, UserArray   

    if name == userinput: 
     founduser = 1 

    if password == passinput: 
     userstatus = UserArray.index(name) 
     founduser = 2 
Смежные вопросы