我的 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 一起运行?
请您参考如下方法:
行:
hashlib.md5.new()
不正确,应该是:
hashlib.md5()
这是抛出一个错误,你的异常吃代码正在吃。这就是为什么一般的 except: 无论如何都继续是一个坏主意的原因,尤其是在像您这样的情况下,这可能会使程序处于不良状态。
为什么这在 2.7 上有效我不知道,但我怀疑它可能没有按照你认为的那样去做。
此外,由于 3.x 中的 hashlib 在创建哈希时会重新播种哈希,因此您最好创建一个具有已知哈希的单个实例。
