2013-07-02 3 views
-2

У меня есть эта часть кода, которая вычисляет значение MD5 и SHA1 данного файла и представляет его в консоли. Он делает свою работу, однако я получаю сообщение об ошибке:IndexError: индекс индекса вне диапазона [Python]

Traceback (most recent call last): 
File "C:\Program Files (x86)\Aptana\workspace\Ipfit5\Semi-Definitief\test6.py", 
line 64, in <module> 
hash_file(woord) 
File "C:\Program Files (x86)\Aptana\workspace\Ipfit5\Semi-Definitief\test6.py", 
line 29, in hash_file 
hash_file(sys.argv[1]); 
IndexError: list index out of range 

код выглядит следующим образом:

import sys, hashlib, os 

def hash_file(filename): #Calculate MD5 and SHA1 hash values of a given file 

# Create hash objects for MD5 and SHA1. 
md5_hash = hashlib.md5() 
sha1_hash = hashlib.sha1() 
filename = r"C:/this.png" 

# Read the given file by 2K blocks. Feed blocks 
# into into the hash objects by "update(data)" method. 
fp = open(filename,'rb') 
while 1: 
    data = fp.read(2048) 
    if not data: 
     break 
    else: 
     md5_hash.update(data) 
     sha1_hash.update(data) 
     fp.close() 
     print "The MD5 hash of your file is" 
     print filename,":", md5_hash.hexdigest(); 
     print "The SHA1 hash of your file is" 
     print filename,":", sha1_hash.hexdigest(); 
     if __name__ == '__main__': 
      hash_file(sys.argv[1]); 

hash_file(woord) 

я вызываю функцию для (woord), потому что это что-то определенное позже в сценарии , но это в основном то же изображение, что и имя файла в функции hash_file (filename).

Почему я получаю эту ошибку, когда она показывает мне как значения хэша, так и как я могу избавиться от нее?

EDIT: Я знаю, что есть что-нибудь сделать с, если 'основной' изменения имен ==: hash_file (sys.argv [1]); но я не могу понять это.

Любая помощь очень ценится

ответ

0

Существует что-то не так с этим куском кода, на «если„главногоизменения имен ==:» заявление, означает, что код внутри „если“ работать только когда код питона выполняется и не когда он используется как модуль. Но внутри «if» используется рекурсивный вызов: hash_file (sys.argv [1]), это означает, что для этого кода нужен аргумент, но он начнет бесконечный рекурсивный цикл.

Я думаю, что код:

if __name__ == '__main__': 
    hash_file(sys.argv[1]); 

выходит за пределы функции hash_file()

Я думаю, что это будет работать, как вы хотите:

import sys, hashlib, os 

def hash_file(filename): #Calculate MD5 and SHA1 hash values of a given file 

# Create hash objects for MD5 and SHA1. 
md5_hash = hashlib.md5() 
sha1_hash = hashlib.sha1() 
filename = r"C:/this.png" 

# Read the given file by 2K blocks. Feed blocks 
# into into the hash objects by "update(data)" method. 
fp = open(filename,'rb') 
while 1: 
    data = fp.read(2048) 
    if not data: 
     break 
    else: 
     md5_hash.update(data) 
     sha1_hash.update(data) 
fp.close() 
print "The MD5 hash of your file is" 
print filename,":", md5_hash.hexdigest(); 
print "The SHA1 hash of your file is" 
print filename,":", sha1_hash.hexdigest(); 

# other code here 

if __name__ == '__main__': 
#hash_file(sys.argv[1]); 
hash_file(woord) 
+0

действительно, правда, но когда я помещаю этот фрагмент кода вне функции hash_file(), скрипт больше ничего не будет делать. Он просто дает ошибку hash_file (sys.ARGV [1]); IndexError: список индексы вне диапазона – Nick

+0

Это не похоже, чтобы исправить мою проблему, потому что хочет, это какое-то вход из если __name__ == «__main__»: ли вы полагаете, есть способ полного удаления этого кода ? Я видел, что единственная причина, по которой это можно использовать, заключается в том, что его можно использовать как импорт для других модулей, но мне не нужно, чтобы – Nick

+0

, если вы не собираетесь вызывать скрипт с аргументом, вам нужно удалить вызов sys.argv [1], замените его на hash_file (woord) – Cesar

0

При запуске файла, вы должны дать дополнительный аргумент:

$ python myfile.py argument 

Если вы печатаете sys.argv, вы получите что-то вроде:

['myfile.py`] 

Но после добавления дополнительного аргумента вы можете получить что-то вроде:

['myfile.py', 'argument'] 

И это то, к чему обращается [1].

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

+0

им работает изнутри Aptana Studio 3 поэтому он просто подскажет мне несколько входов и работает с этим, тогда он вычислит значение хэша. Так что я не могу дать дополнительный аргумент, или я ошибаюсь? – Nick

+0

@Nick Извините, я не могу вам помочь :(Вам нужно будет найти другой способ запустить ваш скрипт (возможно), чтобы вы могли добавить дополнительную информацию. Извините еще раз – TerryA

+0

хорошо, спасибо в любом случае! – Nick

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