我的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中运行?
这条线:
hashlib.md5.new()
Run Code Online (Sandbox Code Playgroud)
是不正确的,应该是:
hashlib.md5()
Run Code Online (Sandbox Code Playgroud)
这会引发您的异常饮食代码正在吃的错误.这就是为什么一个except:简单地继续的将军是一个坏主意,特别是在像你这样的情况下,这可能使程序处于不良状态.
为什么这适用于2.7我不知道,但我怀疑它可能没有做你认为它正在做的事情.
此外,由于3.x中的hashlib在创建哈希时重新设置哈希,因此最好创建具有已知哈希的单个实例.