我有这段代码可以计算给定文件的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]);但我无法弄清楚。
非常感谢任何帮助
答案 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)