Pythonでbytes関数を使う方法を解説する

スポンサーリンク

Python の bytes() は組み込み関数で、0 <= x < 256 の範囲の整数の不変シーケンスである bytes オブジェクトを返します。

ソースとして渡されたオブジェクトの種類に応じて、byteオブジェクトを初期化します。

今回は、この関数をどのように使うか見てみましょう。


スポンサーリンク

シンタックス

これは、3つのオプションのパラメータを受け取ります。

  • source -> バイト配列を初期化するソース
  • encoding -> sourceの文字列のエンコーディング (UTF-8 など).
  • errors -> ソースの文字列のエンコードに失敗したときのこの関数の動作。
byte_array = bytes(source, encoding, errors)

3つの引数はすべてオプションなので、空の文字列を渡すと、空のバイト配列 (サイズ0のバイト配列) を生成することができる。

引数 source の型に応じて、適切なバイト配列が初期化される。

  • もし source が String の場合、Python bytes() は str.encode() を用いて文字列をバイトに変換します。したがって、文字列を処理するために encode() が使用されるので、エンコーディングとオプションでエラーも指定する必要があります。
  • もし source が整数であれば、Python bytes() は整数サイズの配列を作成し、すべて NULL で初期化されます。
  • もし sourceObject クラスの場合、バイト配列を初期化するためにオブジェクトの読み込み専用バッファが使用されます。
  • もし source が iterable の場合、0 <= x < 256 の範囲の整数のイテレートである必要があり、これが配列の初期コンテンツとして使用されます。

sourceNoneの場合、Noneオブジェクトをバイト配列に変換できないため、TypeError` が発生します。

この関数をよりよく理解するために、いくつかの例を見てみましょう。


Pythonのbytes()を使う

無引数と無引数の場合

b = bytes()
print(b)
c = bytes(None)
print(c)

結果は以下の通りです。

b''
TypeError: cannot convert 'NoneType' object to bytes

ソースストリングを持つ

エンコーディングを指定せずに文字列を渡すと、 TypeError が発生します。

同様に、bytes オブジェクトを変更しようとしても、もともと不変なので同じ例外が発生します。

try:
    a = bytes('Hello from Python')
except TypeError:
    print('We need to specify string encoding always!')
 
b = bytes('Hello from Python', 'UTF-8')
print(type(b), b)
 
try:
    b[0] = 10
except TypeError:
    print('byte objects are immutable!')

結果は以下の通りです。

We need to specify string encoding always!
<class 'bytes'> b'Hello from Python'
byte objects are immutable!

ソースがIntegerの場合

整数が0になると、その数だけ配列のバイト要素オブジェクトが初期化されます。

a = bytes(10)
print(type(a), a)

結果は以下の通りです。

<class 'bytes'> b'x00x00x00x00x00x00x00x00x00x00'

見ての通り、bytesオブジェクトは10個の要素からなるゼロ初期化された配列です。

ソースイテラブルで

これは,配列の要素数 len(iterable) を初期化し,各要素はイテラブル上の対応する要素と等しい値を持ちます.

バイト配列の値は,通常の反復処理によってアクセスすることができますが,不変なので変更することはできません.

a = bytes([1, 2, 3])
print(type(a), a)
print('Length =', len(a))
 
# To access the byte array values, we can iterate through it!
for byte_obj in a:
    print(byte_object)

結果は以下の通りです。

<class 'bytes'> b'x01x02x03'
Length = 3
1
2
3

反復処理可能な要素に他の要素を指定すると、TypeErrorが発生します。

>>> a = bytes([1, 2, 3, 'Hi'])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' object cannot be interpreted as an integer

まとめ

今回は、Pythonのbytes()関数について、適当なオブジェクトをバイト配列に変換する方法を学びました。


タイトルとURLをコピーしました