IndexError:列表索引超出范围[Python]

时间:2013-07-02 12:57:54

标签: python hash indexing

我有这段代码可以计算给定文件的MD5和SHA1值,并在控制台中显示。它完成了它的工作,但是我得到了错误消息:

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)中的文件名基本相同。

为什么我确实向我显示了哈希值以及如何摆脱它时会出现此错误?

编辑:我知道它与if 名称 ==&#39; 主要&#39;有一些关系:                  hash_file(sys.argv中[1]);但我无法弄清楚。

非常感谢任何帮助

2 个答案:

答案 0 :(得分:0)

运行文件时,您必须提供额外的参数:

$ python myfile.py argument

如果您打印sys.argv,您将获得类似的内容:

['myfile.py`]

但是一旦添加了额外的参数,你就可以得到类似的东西:

['myfile.py', 'argument']

这就是[1]访问的内容。

如你所知,代码比我更多,你必须弄清楚脚本期望作为一个论点。

答案 1 :(得分:0)

这段代码有问题,“如果名称 =='主要':”语句,意味着只有“if”内的代码在执行python代码时工作,而不是在用作模块时工作。 但是在“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)