我的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中运行?
答案 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可能会大声失败,而不是无声地生成不正确的数据
或者,更有可能 - 看杰克的答案。