base 64 でテキストをデコードしようとしていますが、それをしようとしているときにエラーが発生する理由がわかりません。
b'Zm9v'.decode('base64_codec')
発生する例外は次のとおりです。TypeError: expected bytes, not memoryview
PS: モジュールを使用する代替手段があることは知っていbase64
ます。しかし、好奇心から答えを知りたいと思っています。
ありがとう!
base 64 でテキストをデコードしようとしていますが、それをしようとしているときにエラーが発生する理由がわかりません。
b'Zm9v'.decode('base64_codec')
発生する例外は次のとおりです。TypeError: expected bytes, not memoryview
PS: モジュールを使用する代替手段があることは知っていbase64
ます。しかし、好奇心から答えを知りたいと思っています。
ありがとう!
残念ながら、bytes.decode()
andstr.encode()
メソッドは (当然のことながら) タイプ間の変換も行うコーデックのみをサポートします。常にオブジェクトを返すbytes.decode()
必要がありますが、返す必要があります。これらのコーデックを導入した元の問題を参照してください。str
str.encode()
bytes
コーデックは任意の型で動作できます。これは、Unicode およびバイト オブジェクトのヘルパー メソッドが Python 3.x の型の 1 つの組み合わせしかサポートしていないということです。
bytes.decode()
したがって、表示される特定のエラーは、メソッドが常に type の値を返すことを期待しているという事実によって引き起こされますstr
。同様に、このメソッドは、戻り値としてstr.encode()
返されないコーデックを無効にします。bytes
>>> 'Ceasar'.encode('rot_13')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: encoder did not return a bytes object (type=str)
そのため、bytes-to-bytes および str-to-str コーデックの場合、codecs
モジュールを直接使用する必要があります。
import codecs
codecs.getdecoder('base64_codec')(b'Zm9v')[0]