1. ホーム
  2. python

[解決済み】 AttributeError:'bytes' object has no attribute 'encode'.

2022-02-05 14:45:01

質問

Python2からPython3へコードをインポートしようとして、この問題が発生しました。

    <ipython-input-53-e9f33b00348a> in aesEncrypt(text, secKey)
     43 def aesEncrypt(text, secKey):
     44     pad = 16 - len(text) % 16
---> 45     text = text.encode("utf-8") + (pad * chr(pad)).encode("utf-8")
     46     encryptor = AES.new(secKey, 2, '0102030405060708')
     47     ciphertext = encryptor.encrypt(text)

AttributeError:'bytes' オブジェクトには 'encode' という属性がありません。

を削除すると .encode("utf-8") というエラーが出てしまいます。どうやら {コード はバイト文字列のようです。を使うことはできません。 pad*chr(pad)

encode()

TypeError: strをbyteに連結できません。

しかし、不思議なことに、その部分だけ試してみると、encode()はうまくいくのです。

    <ipython-input-65-9e84e1f3dd26> in aesEncrypt(text, secKey)
     43 def aesEncrypt(text, secKey):
     44     pad = 16 - len(text) % 16
---> 45     text = text.encode("utf-8") + (pad * chr(pad))
     46     encryptor = AES.new(secKey, 2, '0102030405060708')
     47     ciphertext = encryptor.encrypt(text)

解決するには?

文字列のようなオブジェクトがPython 2の文字列(バイト)かPython 3の文字列(ユニコード)かわからない場合。汎用的な変換器を用意すればいい。

Python3のシェルです。

text = { 'username': '', 'password': '', 'rememberLogin': 'true' }
text=json.dumps(text)
print(text)
pad = 16 - len(text) % 16 
print(type(text))
text = text + pad * chr(pad) 
print(type(pad * chr(pad)))
print(type(text))
text = text.encode("utf-8") + (pad * chr(pad)).encode("utf-8") 
print(type(text))

{"username": "", "password": "", "rememberLogin": "true"}
<class 'str'>
<class 'str'>
<class 'str'>
<class 'bytes'>

Python 2 では、これらの式は両方とも次のように評価されます。 >>> def to_bytes(s): ... if type(s) is bytes: ... return s ... elif type(s) is str or (sys.version_info[0] < 3 and type(s) is unicode): ... return codecs.encode(s, 'utf-8') ... else: ... raise TypeError("Expected bytes or string, but got %s." % type(s)) ... >>> to_bytes("hello") b'hello' >>> to_bytes("hello".encode('utf-8')) b'hello' : True と {コード {コード . そして type("hello") == bytes は次のように評価されます。 type("hello") == str一方 type(u"hello") == str

Falseであり、かつ {コード は {コード . そして type(u"hello") == unicode を発生させます。 True 例外が発生します。 type("hello") == bytes

False

type("hello") == str