HOWTO · Python
Python の Bytes-Like Object Is Required Not STR エラーの修正
このチュートリアルでは、Python の str エラーではなく、バイトのようなオブジェクトが必要であると説明しています。
このページの内容
このチュートリアルでは、Python のエラー a bytes-like object is required, not 'str' について説明し、その修正方法を説明します。この TypeError は、間違ったデータ型に対して無効な操作が実行された場合に表示されます。
Python の文字列オブジェクトとバイトオブジェクトについて説明します。文字列は文字のコレクションですが、後者はバイトのシーケンスであり、Unicode オブジェクトとも呼ばれます。Python 3 では、すべての文字列はデフォルトで Unicode オブジェクトです。Python 2 では、encode および decode 関数を使用して文字列を Unicode に、またはその逆に変換できます。
バイトオブジェクトを操作しているが、それを文字列として扱っている場合、このエラーが発生します。Python 2 と Python 3 でこれらのオブジェクトが変更されたためによくあることです。バイナリファイルを操作しているときにこのエラーが発生し、文字列として扱われます。
例えば:
with open("myfile.txt", "rb") as f:
a = f.read()
print(type(a))
a.split(";")
出力:
TypeError: a bytes-like object is required, not 'str'
上記の例では、rb モードでファイルを読み取ります。このモードは、バイナリファイルを読み取ることを意味します。この内容はバイトであり、変数 a に格納され、型を表示します。
この変数に split() 関数を適用すると、str ではなくバイトのようなオブジェクトが必要というエラーが発生します。これは、split() 関数が文字列オブジェクトで機能するためです。
このエラーを回避するには、データ読み取りタイプとその操作に注意してください。str() 関数を使用してバイトのようなオブジェクトを文字列に変換することで、このエラーを修正することもできます。
例えば:
with open("myfile.txt", "rb") as f:
a = str(f.read())
print(type(a))
s = a.split(";")
出力:
<class 'str'>
str() は、オブジェクトを文字列に変換して、split() 関数を使用します。
このエラーは、ソケットを操作してデータを送受信するときにも頻繁に発生します。文字列の前に b 文字を使用してバイトを送信したり、utf-8 パラメーターを指定して encode() 関数を使用したりできます。
例えば:
data = b"result"
s.sendall(data)