在Python 2.7中运行的代码打破了Python 3.5.1

时间:2016-04-27 13:16:56

标签: python python-3.x

我的Python代码在Python 2.7中运行良好,但是当我使用Python 3运行它时,它无法正常工作:

import sys, os, hashlib

dir_name = sys.argv[1]

# Get the total number of args passed to the crawler.py and set default
# directory
def check_arguments():
    global dir_name
    total = len(sys.argv)
    if total > 2:
        print("Bitte geben Sie nur ein Argument als Startverzeichnis an.")
        sys.exit()
    elif total == 2:
        try:
            os.listdir(dir_name)
            print("Startverzeichnis " + dir_name + " wird verwendet.")
        except:
            print("Geben Sie ein gültiges Startverzeichnis an.")
            sys.exit()
    else:
        print("Startverzeichnis /tmp wird verwendet.")
        dir_name = '/tmp'

def create_MD5(dir_name):
    file_list = []
    hash_list = []
    for file in os.listdir(dir_name):
        try:
            if os.path.isfile(os.path.join(dir_name, file)):
                print("Folgende Datei gefunden: " , os.path.join(dir_name, file))
                file_list.append(file)
                hash = hashlib.md5.new()
                f = open(os.path.join(dir_name, file),'rb')
                hash.update(f.read())
                f.close()
                hash_list.append(hash.digest())

            elif os.path.isdir(os.path.join(dir_name, file)):
                print("Folgendes Verzeichnis gefunden:", os.path.join(dir_name, file))
                #print_files()
                fl, hl = create_MD5(os.path.join(dir_name, file))
                for i in fl:
                    file_list.append(i)
                for i in hl:
                    hash_list.append(i)
            else:
                pass
        except:
            print("Fehlende Zugriffsrechte")

    return file_list, hash_list

def print_MD5():
    fl, hl = create_MD5(dir_name)
    for i in range(len(fl)):
        print(os.path.join("Die Datei ", '%-22s  hat folgenden MD5-Hash: %s' % (fl[i], hl[i])))

check_arguments()
print_MD5()
在控制台中我得到了:

Traceback (most recent call last):
  File "crawler.py", line 77, in <module>
    print_MD5()
  File "crawler.py", line 74, in print_MD5
    print(os.path.join("Die Datei ", '%-22s  hat folgenden MD5-Hash: %s' % (fl[i], hl[i])))
IndexError: list index out of range

如何更改代码以便它也可以在Python 3中运行?

2 个答案:

答案 0 :(得分:5)

该行:

hashlib.md5.new()

不正确,应该是:

hashlib.md5()

这会引发您的异常饮食代码正在吃的错误。这就是为什么一般的except:无论如何都是一个坏主意,特别是在像你这样的情况下,这可能使程序处于不良状态。

为什么这适用于2.7我不知道,但我怀疑它可能没有做你认为它正在做的事情。

此外,由于3.x中的hashlib在创建时重新设置了哈希,因此最好创建一个具有已知哈希的单个实例。

答案 1 :(得分:2)

您的'f1'列表比'h1'列表长。

从代码中很难说出它是如何达到这种状态的。我的猜测是在调用file_list.append()之后的一些点,你在调用hash_list.append之前遇到异常。可能在'f = open(...)'行。

重构create_MD5代码以确保两个附加之间不会发生异常,并且应该修复它。

修改 至于它在2.7而不是3.5的原因。我的猜测是它与Python 3 'Whatsnew'

中的以下内容有关
  

作为文本文件打开的文件(仍然是open()的默认模式)总是使用编码在字符串(在内存中)和字节(在磁盘上)之间进行映射。二进制文件(在mode参数中用b打开)总是在内存中使用字节。这意味着如果使用不正确的模式或编码打开文件,I / O可能会大声失败,而不是无声地生成不正确的数据

或者,更有可能 - 看杰克的答案。