1. ホーム
  2. python

[解決済み] Python 3で文字列をバイトに変換する最良の方法?

2022-03-17 15:44:14

質問

文字列をバイトに変換する方法は2種類あるようです。 TypeError: 'str' は buffer インタフェースをサポートしていません。

どちらの方法がより良い、あるいはよりPythonicな方法でしょうか?それとも単に個人の好みの問題でしょうか?

b = bytes(mystring, 'utf-8')

b = mystring.encode('utf-8')

解決方法は?

のドキュメントを見ると bytes を指し示す。 bytearray :

bytearray([ソース[, エンコーディング[, エラー]])

新しいバイトの配列を返します。bytearray型は0 <= x < 256の範囲の整数の変更可能な配列である。また、bytes型が持つほとんどのメソッドは、 Bytes and Byte Array Methods を参照してください。

オプションの source パラメータは、いくつかの異なる方法で配列を初期化するために使用されます。

文字列の場合は、エンコード(オプションでエラー)パラメータも与える必要があります。bytearray() は次に str.encode() を使用して文字列をバイトに変換します。

整数の場合、配列はそのサイズになり、ヌルバイトで初期化されます。

buffer インタフェースに準拠したオブジェクトの場合、bytes 配列の初期化にそのオブジェクトの読み取り専用 buffer が使用されます。

反復可能な場合は,0 <= x < 256 の範囲の整数の反復可能でなければならず,これを配列の初期内容として使用する。

引数がない場合、サイズ0の配列が作成されます。

そこで bytes は単に文字列をエンコードするだけでなく、もっと多くのことができます。それが、意味のあるあらゆるタイプのソースパラメータでコンストラクタを呼び出すことを可能にするのは、Pythonicなことです。

文字列をエンコードする場合、私は some_string.encode(encoding) はコンストラクタを使うよりも Pythonic で、最も自己文書化されているからです -- "take this string and encode it with this encoding" は bytes(some_string, encoding) -- コンストラクタを使う場合は、明示的な動詞はありません。

Pythonのソースを確認しました。にunicode文字列を渡すと bytes を CPython を使って呼び出すと PyUnicode_AsEncodedString の実装である encode を呼び出すと、間接的なレベルをスキップすることになります。 encode を自分で作る。

また、Serdalisのコメントもご覧ください --。 unicode_string.encode(encoding) は、その逆が byte_string.decode(encoding) と対称性がいい。