2015-10-21 2 views
1

я изменил мой код:Что вызывает объект 'int', не имеет атрибута 'has_key'?

print '\n' 
search = raw_input("For which account are you searching: ") 
f = shelve.open("passwords.dat") 
for line in f: 
    if search in f: 
     passwrd = f[search] 
     entry = passwrd[0] 
     f.close() 
     print line 
     print '\n' 
print "I'm sorry we could not find any account related to " + search 
print '\n' 
f.close() 

И теперь он не будет принимать никаких правильных счетов и отдает эту ошибку:

'int' object has no attribute 'has_key' 

Почему я теперь получаю это сообщение?

File "E:\password.py", line 98, in program_start 
    find_account() 
    File "E:\password.py", line 36, in find_account 
    if search in f: 
    File "C:\Python24\lib\shelve.py", line 107, in __contains__ 
    return self.dict.has_key(key) 
AttributeError: 'int' object has no attribute 'has_key' 
+1

Какая линия является линией 98? –

+1

'f' - это указатель файла. Эта строка неверна: 'passwrd = f [search]'. Не уверен, что вы пытаетесь сделать, но вы не можете индексировать «f» таким образом. – RobertB

+1

@RobertB f является https://docs.python.org/2/library/shelve.html, а не указателем на файл – user2085282

ответ

2

Shelve возвращает один dict.
Так что нет смысла читать несколько строк из этого, что я могу сказать.

Я думаю, что это должно работать:

print '\n' 
search = raw_input("For which account are you searching: ") 
with shelve.open("passwords.dat") as f: 
    for passwords in f: 
     if search in passwords: 
      password = passwords[int(search)] 
      entry = passwrd[0] 
      print passwords 
      print '\n' 
     else: 
      print "I'm sorry we could not find any account related to " + search 
print '\n' 
+1

Кажется, что это так. Но верен ли 'f.close()' внутри цикла 'for'? –

+0

@RobertB После его изменения я получаю следующее: «Traceback (последний последний звонок): Файл« E: \ password.py », строка 103, в? program_start() файла "E: \ password.py", строка 98, в program_start find_account() файла "E: \ password.py", строка 37, в find_account passwrd = линия [поиск] Ошибка типа: Строковые индексы должны быть целыми числами. –

+1

№. Не закрывайте 'f', пока не закончите обработку всех строк. Таким образом, вне цикла for. В противном случае программа попытается снова зациклиться, попытаться прочитать из закрытого файла и выбросить еще одну ошибку – RobertB

Смежные вопросы