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

Sta*_*erd 1 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()
Run Code Online (Sandbox Code Playgroud)

在控制台我得到:

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
Run Code Online (Sandbox Code Playgroud)

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

Jac*_*ley 5

这条线:

hashlib.md5.new()
Run Code Online (Sandbox Code Playgroud)

是不正确的,应该是:

hashlib.md5()
Run Code Online (Sandbox Code Playgroud)

这会引发您的异常饮食代码正在吃的错误.这就是为什么一个except:简单地继续的将军是一个坏主意,特别是在像你这样的情况下,这可能使程序处于不良状态.

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

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