为什么我在这里得到UnicodeDecodeError?

时间:2012-12-03 18:10:50

标签: python python-3.x

我正在尝试制作一个python脚本,以便在USB闪存盘中找到重复的文件。

我正在关注的进程是创建文件名列表,散列每个文件,然后创建反向字典。然而,在过程的某个地方,我得到UnicodeDecodeError。有人能帮我理解发生了什么吗?

from os import listdir
from os.path import isfile, join
from collections import defaultdict
import hashlib

my_path = r"F:/"

files_in_dir = [ file for file in listdir(my_path) if isfile(join(my_path, file)) ]
file_hashes = dict()

for file in files_in_dir:
    file_hashes[file] = hashlib.md5(open(join(my_path, file), 'r').read()).digest()

inverse_dict = defaultdict(list)

for file, file_hash in file_hashes.iteritems():
    inverse_dict[file_hash].append(file)

inverse_dict.items()

我面临的错误是:

Traceback (most recent call last):
  File "C:\Users\Fotis\Desktop\check_dup.py", line 12, in <module>
    file_hashes[file] = hashlib.md5(open(join(my_path, file), 'r').read()).digest()
  File "C:\Python33\lib\encodings\cp1253.py", line 23, in decode
    return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0xff in position 2227: character maps to <undefined>

1 个答案:

答案 0 :(得分:4)

您正在尝试读取未使用默认平台编码(cp1253)编码的文件。通过以文本模式(r)打开文件,Python 3将尝试将文件内容解码为unicode。您没有指定编码,因此使用了平台首选编码。

使用rb作为模式,以二进制模式打开文件。由于您只计算MD5哈希值(一个需要字节的函数),因此您不应该使用文本模式。