【问题标题】:IndexError: list index out of range [Python]IndexError:列表索引超出范围 [Python]
【发布时间】:2013-07-02 12:57:54
【问题描述】:

我有这段代码可以计算给定文件的 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)

我将函数称为 (wood),因为这是稍后在脚本中定义的,但它与函数 hash_file(filename) 中的文件名基本相同。

当它确实显示了哈希值以及如何摆脱它时,为什么我会收到此错误?

编辑:我知道这与 if name == 'ma​​in' 有关: hash_file(sys.argv[1]);但我无法弄清楚。

非常感谢任何帮助

【问题讨论】:

    标签: python hash indexing


    【解决方案1】:

    那段代码有问题,“if name == 'ma​​in':”语句,意思是“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)
    

    【讨论】:

    • 确实如此,但是当我将那段代码放在 hash_file() 函数之外时,脚本将不再执行任何操作。它只是给出错误 hash_file(sys.argv[1]); IndexError: 列表索引超出范围
    • 这似乎无法解决我的问题,因为它需要来自 if name == 'main' 的某种输入:你认为有没有办法完全删除该代码?我已经看到人们使用它的唯一原因是它可以用作其他模块的导入,但我不需要它
    • 如果你不打算用参数调用 scrpt,你需要删除 sys.argv[1] 调用,用 hash_file(wood) 替换它
    • 请记住,在 hash_file() 函数中,您正在重新定义参数“文件名”,因此“木头”不会被计算在内
    • 它似乎以某种方式工作,但现在我在 data = fp.read(2048) 上得到一个不同的错误。 data = fp.read(2048) ValueError: I/O operation on closed file 我只是不明白出了什么问题,因为它不是一个复杂的脚本
    【解决方案2】:

    在运行文件时,你必须提供一个额外的参数:

    $ python myfile.py argument
    

    如果你打印sys.argv,你会得到类似的东西:

    ['myfile.py`]
    

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

    ['myfile.py', 'argument']
    

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

    由于您比我更了解代码,因此您必须弄清楚脚本期望的参数是什么。

    【讨论】:

    • 我从 aptana studio 3 内部运行,所以它只是提示我一些输入并使用它,然后它会计算哈希值。所以我真的不能给出额外的论点,还是我错了?
    • @Nick 抱歉,我无法为您提供帮助 :(。您必须找到另一种方式来运行您的脚本(也许),以便您可以添加额外信息。再次抱歉