パスワードのファイルを読み込もうとしています。次に、各パスワードのハッシュを計算し、それを、パスワードを発見したかどうかを判断するためにすでに持っているハッシュと比較しようとしています。ただし、私が取得し続けるエラーメッセージは、「TypeError:ハッシュする前にUnicodeオブジェクトをエンコードする必要があります」です。これが私のコードです:
from hashlib import sha256
with open('words','r') as f:
for line in f:
hashedWord = sha256(line.rstrip()).hexdigest()
if hashedWord == 'ca52258a43795ab5c89513f9984b8f3d3d0aa61fb7792ecefe8d90010ee39f2':
print(line + "is one of the words!")
誰かが助けて説明を提供できますか?
エラーメッセージは、その内容を正確に示しています。Unicode文字列があります。 Unicode文字列をSHA-256ハッシュすることはできません。ハッシュできるのはバイトのみです。
しかし、なぜUnicode文字列があるのですか?テキストモードでファイルを開いているので、Pythonにデフォルトのエンコーディングを使用してそのファイルのバイトをUnicodeにデコードするように暗黙的に要求していることを意味します。生バイト、バイナリモードを使用する必要があります。
つまり、次の行を変更するだけです。
_with open('words','r') as f:
_
…へ:
_with open('words', 'rb') as f:
_
これを修正すると、print
行で例外が発生することに気付くでしょう。どうして? bytes
をstr
に追加しようとしているためです。また、スペースが不足していて、ストリップされていない行を印刷しています。 print
に2つの引数を使用することで、これらすべてを修正できます(print(line.rstrip(), "is one of the words")
のように)。
ただし、_b'\xc3\x85rhus' is one of the words
_を出力したい場合は、_Århus is one of the words
_のような出力が得られます。これは、文字列ではなくバイトがあるためです。 Pythonはデコードされなくなったため、手動でデコードする必要があります。open
にエンコードを指定しない場合に機能することがある同じデフォルトのエンコードを使用するには、decode
を呼び出すだけです。引数なし。したがって:
_print(line.rstrip().decode(), "is one of the words")
_