1

USBフラッシュドライブで重複ファイルを見つけるためのpythonスクリプトを作成しようとしています。

私がフォローしているプロセスは、ファイル名のリストを作成し、各ファイルをハッシュしてから、逆辞書を作成することです。ただし、プロセスのどこかで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>
4

1 に答える 1

4

デフォルトのプラットフォーム エンコーディング ( ) でエンコードされていないファイルを読み込もうとしていますcp1253。ファイルをテキスト モード ( r) で開くと、Python 3 はファイルの内容を Unicode にデコードしようとします。エンコーディングを指定しなかったため、プラットフォームで優先されるエンコーディングが使用されます。

モードとして使用して、代わりにバイナリ モードでファイルを開きrbます。MD5 ハッシュ (バイトを予期する関数) を計算しているだけなので、とにかくテキスト モードを使用するべきではありません。

于 2012-12-03T18:16:03.937 に答える