2014-12-08 2 views
0

У меня проблема с моим кодом, где всегда есть ошибка 'file' object has no attribute '__getitem__'. Вот мой код:«файл» объект не имеет атрибута «__getitem__»

def passHack(): 
    import random 
    p1 = random.choice(["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"]) 
    p2 = random.choice(["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"]) 
    p3 = random.choice(["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"]) 
    p4 = random.choice(["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"]) 
    p = (p1 + p2 + p3 + p4) 
    g = 0000 
    a = 0 
    import time 
    start_time = time.time() 
    print "Working..." 
    while (g != p): 
     a += 1 
     f = open('llll.txt') 
     g = f[a] 
     print g 
     f.close() 
    if (g == p): 
     print "Success!" 
     print "Password:" 
     print g 
     print "Time:" 
     print("%s seconds" % (time.time() - start_time)) 

def loopPassHack(): 
    t = 0 
    while (t <= 9): 
     passHack() 
     t += 1 
     print "\n" 

passHack() 

я заметил, что это произошло, когда я добавил g = f[a], но я попытался добавить атрибут __getitem__ к g, f и a, но она по-прежнему возвращает ту же ошибку. Пожалуйста, помогите, и спасибо, если вы ответите!

+0

Мои идентификаторы коротки. Я бы рекомендовал не использовать имена переменных одной буквы во всем мире, но это более хорошая практика программирования. –

+0

BTW, как правило, вы должны _not_ иметь 'import' утверждения внутри функции, особенно если вы собираетесь называть функцию несколько раз. Кроме того, в Python вам не нужны скобки вокруг выражений условий, например 'while (g! = P):' можно писать более чисто, как 'while g! = P:' –

ответ

4

Как указано в сообщении об ошибке, объекты файла не имеют специального метода __getitem__. Это означает, что вы не можете индексировать их, как список, потому что __getitem__ - это метод, который обрабатывает эту операцию.

Однако, вы всегда можете прочитать файл в списке, прежде чем войти в While-цикл:

with open('llll.txt') as f: 
    fdata = [line.rstrip() for line in f] 
while (g != p): 
    ... 

Затем вы можете индексировать список строк, как вы были:

a += 1 
g = fdata[a] 
print g 

В качестве дополнительного бонуса мы больше не открываем и не закрываем файл с каждой итерацией цикла. Вместо этого он открывается один раз до того, как цикл запустится и затем будет закрыт, как только будет выведен кодовый блок под with-statement.

Также, list comprehension и вызывается str.rstrip на каждой строке, чтобы удалить любые завершающие символы новой строки.

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