Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonのバイナリシーケンス型入門!bytes・bytearray・memoryviewの使い方を徹底解説

Pythonでは、bytesbytearrayという2つの型を使ってバイナリデータを操作できます。これらの型は、memoryviewと呼ばれるバッファプロトコルによってサポートされています。memoryviewを使うと、実際のデータをコピーすることなく、他のバイナリオブジェクトのメモリに直接アクセスできるため、大量のデータを扱う際に効率的です。

バイトリテラルの記述方法

bytesオブジェクト(バイトリテラル)は、以下のいずれかの方法で作成できます。

  • b'シングルクォートで囲んだバイト列'

  • b"ダブルクォートで囲んだバイト列"

  • b'''三重のシングルクォートで囲んだバイト列''' または b"""三重のダブルクォートで囲んだバイト列"""

なお、bytesはイミュータブル(変更不可)であるのに対し、bytearrayはミュータブル(変更可能)という違いがある点にも注意しましょう。

bytes・bytearrayの主なメソッド一覧

fromhex(string)メソッド

fromhex()メソッドは、16進数形式の文字列からbytesオブジェクトを生成します。引数には各バイトが2桁の16進数で表された文字列を渡します。文字列中に含まれるASCII空白文字(スペースなど)は自動的に無視されます。

hex()メソッド

hex()メソッドは、bytesオブジェクトの各バイトを2桁の16進数文字列に変換して返します。fromhex()と逆の変換を行うメソッドです。

replace(byte, new_byte)メソッド

replace()メソッドは、指定したバイト列を新しいバイト列に置き換えます。元のオブジェクトは変更されず、置き換え後の新しいオブジェクトが返されます。

count(sub[, start[, end]])メソッド

count()メソッドは、部分バイト列が登場する回数(重複しない出現回数)を返します。オプションでstartとendを指定すると、その範囲内だけを検索対象とします。

find(sub[, start[, end]])メソッド

find()メソッドは、部分バイト列が最初に現れる位置(インデックス)を返します。見つかった場合はそのインデックスを、見つからなかった場合は-1を返します。

partition(sep)メソッド

partition()メソッドは、区切り文字(sep)を基準にバイト列を分割します。戻り値は「(区切り前の部分, 区切り文字, 区切り後の部分)」という3要素のタプルになります。

memoryview(obj)メソッド

memoryview()メソッドは、引数に渡したオブジェクトのmemoryviewオブジェクトを返します。memoryviewはPythonのバッファプロトコルへの安全なアクセス手段であり、オブジェクト内部のバッファにコピーなしでアクセスできます。大きなバイナリデータの一部だけを参照したい場合などに便利です。

サンプルコード

hexStr = bytes.fromhex('A2f7 4509')
print(hexStr)

byteString = b'\xa2\xf7E\t'
print(byteString.hex())

bArray1 = b"XYZ"
bArray2 = bArray1.replace(b"X", b"P")
print(bArray2)

byteArray1 = b'ABBACACBBACA'
print(byteArray1.count(b'AC'))

print(byteArray1.find(b'CA'))

bArr = b'Mumbai,Kolkata,Delhi,Hyderabad'
partList = bArr.partition(b',')
print(partList)

myByteArray = bytearray('String', 'UTF-8')
memView = memoryview(myByteArray)

print(memView[2]) # 'r'のASCIIコード
print(bytes(memView[1:5]))

実行結果

b'\xa2\xf7E\t'
a2f74509
b'PYZ'
3
4
(b'Mumbai', b',', b'Kolkata,Delhi,Hyderabad')
114
b'trin'

まとめ

このように、Pythonのバイナリシーケンス型には文字列(str)とよく似た豊富なメソッドが用意されており、16進数との相互変換や検索・置換・分割などを直感的に行えます。画像ファイルや通信プロトコルなど、バイナリデータを扱う場面ではbytes・bytearray・memoryviewを使い分けることで、安全かつ効率的なプログラムを実装できます。

  1. Python Tkinterのafter()メソッドの使い方を徹底解説

    Tkinterは、PythonでGUIアプリケーションを作成するための標準ライブラリです。ウィンドウやボタン、ラベルなどのウィジェットを作成・操作するための組み込みメソッドが多数用意されており、データの表示やGUIイベントの処理を簡単に実装できます。本記事では、その中でも特に便利なafter()メソッドの使い方について、具体的なコード例とともに詳しく解説します。after()メソッドの基本構文.after(delay, FuncName=FuncName)このメソッドは、指定した遅延時間(ミリ秒単位)が経過した後に、引数として渡した関数FuncNameを呼び出します。タイマー処理や定期的な更新

  2. Pythonでリストを出力する方法|インデックスの基本から実践的な出力テクニックまで

    Pythonのリストとは? Pythonのリスト(list)は、複数の要素をひとつにまとめて管理できるデータ型です。リスト内の各要素は順序を持って格納されており、それぞれの位置(インデックス)を指定することで、任意の要素にアクセスできます。 インデックスは0から始まる リストのインデックスは0から始まる点に注意が必要です。つまり、最初の要素が list[0]、2番目の要素が list[1]、3番目の要素が list[2] に対応します。 例えば、以下のようなリストを考えてみましょう。 numbers = [10, 20, 50, 40] print(numbers[2]) # 出力結果:5