Python bytearrayの使い方

この記事のポイント

Pythonのbytearrayはバイトデータを扱うための便利な機能です。プログラミング初心者の方でも理解できるよう、基本から応用までわかりやすく解説していきます。

全て読み終えると、以下のような知識・ノウハウが身につきます。

  • バイトデータの可変配列として操作可能
  • リストのように要素の追加・削除・変更が自由自在
  • ファイル処理やネットワーク通信での活躍が期待できる

この記事では、bytearrayの基本操作から高度な応用まで、ステップバイステップで習得できるようになっています。ぜひ、バイナリデータを自在に扱うためのスキルを身に付けていきましょう。

目次

bytearrayとは?

Pythonのbytearrayは、バイト(0〜255の範囲の整数)を扱うための可変シーケンス型で、編集や更新が可能です。通常のバイト型(bytes)が一度作成すると変更できないのに対し、bytearrayは要素の追加・削除・変更が自由に行えます。これはメモリ上でバイトデータを直接操作したいときに非常に便利です。

たとえば、ファイルの読み書きやネットワーク通信など、バイナリデータを扱う場面で活躍します。中でも、画像処理やデータ圧縮、暗号化といった低レベルの操作を行う際に欠かせない存在です。リストと似た操作感を持っており、Pythonでバイナリデータを効率的に処理するための実務的なスキルとして重宝されます。

【関連】
Pythonをもっと詳しく学ぶならpaizaラーニング

基本構文

bytearrayオブジェクトを作成する方法はいくつかあります。最も基本的な方法は、bytearrayコンストラクタを使用することです。

# bytearray の作成と基本操作 NUMBERS = [65, 66, 67, 68, 69] # 整数のリストからbytearrayを作成 def bytearray_examples(): empty_array = bytearray()# 空のbytearray numbers_array = bytearray(NUMBERS) print(numbers_array) # 各数字がASCII文字に対応 print(numbers_array.decode('ascii'))# デコードして文字列に変換 def main(): bytearray_examples() if __name__ == "__main__": main()

出力結果

bytearray(b'ABCDE')
ABCDE

文字列からbytearrayを作成することもできます。この場合、エンコーディングを指定する必要があります。

# 文字列からbytearrayを作成 text = "イヌ、ネコ、ウサギ" text_bytes = bytearray(text.encode('utf-8')) print(text_bytes) print(text_bytes.decode('utf-8')) # 元の文字列に戻す

出力結果

bytearray(b'\xe3\x82\xa4\xe3\x83\x8c\xe3\x80\x81\xe3\x83\x8d\xe3\x82\xb3\xe3\x80\x81\xe3\x82\xa6\xe3\x82\xb5\xe3\x82\xae')
イヌ、ネコ、ウサギ

bytearrayはリストと同様に、要素の追加、削除、変更などの操作が可能です。これが通常のバイト型(bytes)との大きな違いです。

実用例

bytearrayの実用的な使い方をいくつかのコード例で見ていきましょう。これらの例を通して、bytearrayがどのように活用できるかを理解することができます。各例では、Pythonコードとその実行結果を示しながら、バイナリデータ操作の基本から応用までを解説し、bytearrayの多彩な活用法を紹介します。

bytearrayの基本操作

bytearrayは可変なので、リストのように要素を変更できます。以下の例では、基本的な操作方法を紹介します。

# bytearrayの基本操作 ANIMAL = bytearray("ライオン", "utf-8") def modify_bytearray(data): print("元のbytearray:", data) data[0] = 227 # 最初のバイトを変更 print("最初のバイトを変更:", data) data.append(227) # バイトを追加 print("バイトを追加:", data) def main(): modify_bytearray(ANIMAL) if __name__ == "__main__": main()

出力結果

元のbytearray: bytearray(b'\xe3\x83\xa9\xe3\x82\xa4\xe3\x82\xaa\xe3\x83\xb3')
最初のバイトを変更: bytearray(b'\xe3\x83\xa9\xe3\x82\xa4\xe3\x82\xaa\xe3\x83\xb3')
バイトを追加: bytearray(b'\xe3\x83\xa9\xe3\x82\xa4\xe3\x82\xaa\xe3\x83\xb3\xe3')

バイトデータの連結

複数のbytearrayを連結して、新しいバイトシーケンスを作成できます。

# bytearrayの連結 ANIMAL1 = bytearray("ゾウ", "utf-8") ANIMAL2 = bytearray("キリン", "utf-8") def concatenate_bytearrays(a1, a2): combined = a1 + a2 print(combined) print(combined.decode('utf-8')) def main(): concatenate_bytearrays(ANIMAL1, ANIMAL2) if __name__ == "__main__": main()

出力結果

bytearray(b'\xe3\x82\xbe\xe3\x82\xa6\xe3\x82\xad\xe3\x83\xaa\xe3\x83\xb3')
ゾウキリン

バイトデータの変換

bytearrayとさまざまなデータ型の間で変換する方法を見てみましょう。

# 16進数文字列とbytearrayの変換 HEX_STRING = "50 61 6e 64 61" # スペース区切りの16進数 def hex_string_to_bytearray_and_back(hex_str): hex_bytes = bytearray.fromhex(hex_str) print( hex_bytes) text = hex_bytes.decode('ascii') print( text) hex_back = hex_bytes.hex(' ')# 16進数に戻す print( hex_back) def main(): hex_string_to_bytearray_and_back(HEX_STRING) if __name__ == "__main__": main()

出力結果

bytearray(b'Panda')
Panda
50 61 6e 64 61

ファイルからのバイナリ読み込み

bytearrayを使って、ファイルからバイナリデータを読み込む例です。

# ファイルの部分読み込み(実際のファイルがなくても理解できるサンプル) FILE_NAME = "animal.bin" FILE_BYTES = bytearray(b'lion_and_tiger') def create_sample_file(filename, data): with open(filename, "wb") as f: f.write(data) def read_file_chunk(filename, start, size): buffer = bytearray(size) with open(filename, 'rb') as f: f.seek(start) f.readinto(buffer) return buffer def main(): create_sample_file(FILE_NAME, FILE_BYTES) chunk = read_file_chunk(FILE_NAME, 0, 10) print( chunk.decode('utf-8', errors='ignore')) if __name__ == "__main__": main()

出力結果

lion_and_t

ネットワークデータの処理

ネットワークプログラミングでbytearrayがどのように使われるかを示す例です。

# ネットワークパケット処理のシミュレーション packet = bytearray(b'\x00\x01\x02\x03\x04') # ヘッダーを書き換える packet[0] = 0xFF # データを追加 packet.extend(b'\x05\x06\x07') print(packet) print("パケットサイズ:", len(packet), "バイト")

出力結果

bytearray(b'\xff\x01\x02\x03\x04\x05\x06\x07')
パケットサイズ: 8 バイト

バイト配列の検索と置換

bytearrayの中で特定のパターンを検索し、置換する方法を示します。

# バイトパターンの検索と置換 TEXT = bytearray("ネコとイヌとネコ",'utf-8') OLD_PATTERN = 'ネコ'.encode('utf-8') NEW_PATTERN = 'トラ'.encode('utf-8') def replace_bytes_in_bytearray(data, old, new): position = 0 while True: position = data.find(old, position) if position == -1: break data[position:position + len(old)] = new position += len(new) print(data.decode('utf-8')) def main(): replace_bytes_in_bytearray(TEXT, OLD_PATTERN, NEW_PATTERN) if __name__ == "__main__": main()

出力結果

トラとイヌとトラ

ビット単位の操作

bytearrayを使ってバイトレベルのビット操作を行う例です。

# ビット操作の例 DATA = bytearray([0b10101010]) # 2進数表記 def bitwise_example(data): """特定のビットを反転""" data[0] ^= 0b00001111 # XOR演算で下位4ビットを反転 print(bin(data[0])) # 2進数表記で表示 def main(): bitwise_example(DATA) if __name__ == "__main__": main()

出力結果

0b10100101

データの圧縮と解凍

bytearrayと組み合わせて、データの圧縮と解凍を行う例です。

# データ圧縮の例 import zlib TEXT = "ペンギンペンギンペンギン" DATA = bytearray(TEXT.encode('utf-8')) def compress_and_decompress(data): compressed = bytearray(zlib.compress(data)) decompressed = bytearray(zlib.decompress(compressed)) print("元のデータサイズ:", len(data), "バイト") print("圧縮後のサイズ:", len(compressed), "バイト") print("解凍結果:", decompressed.decode('utf-8')) def main(): compress_and_decompress(DATA) if __name__ == "__main__": main()

出力結果(例)

元のデータサイズ: 36 バイト
圧縮後のサイズ: 21 バイト
解凍結果: ペンギンペンギンペンギン

※実行する環境によって結果が変わる可能性があります

まとめ

Pythonにおけるbytearrayは、バイナリデータを効率的に処理するための可変シーケンス型であり、編集や加工に適しています。通常のbytes型が不変であるのに対し、bytearrayは要素の追加・削除・変更が自由に行えるため、バイトレベルの操作が必要な場面で非常に便利です。

bytearrayの活躍する場面

  • ファイル入出力の効率的な処理
  • ネットワーク通信のデータ操作
  • 画像処理やバイナリデータの編集

重要なポイント

  • bytearrayは0〜255の整数値のみ格納可能
  • 文字列との変換にはエンコード/デコードが必要
  • メモリ効率が高くバイナリ操作に最適

Pythonでのbytearrayの使い方を理解することで、バイナリデータを扱うプログラミングの幅が大きく広がります。ファイル処理やネットワークプログラミング、低レベルデータ操作など、さまざまな場面で活用できるでしょう。初心者にとっては少し難しいと感じるかもしれませんが、基本的な使い方を押さえておくと、将来的に複雑なデータ処理が必要になったときに大いに役立ちます。

とくにPythonでシステムプログラミングや効率的なデータ処理を行いたい場合には、bytearrayの特性を理解し、適切に活用することをおすすめします。リストのような使い勝手の良さと、バイトデータを直接操作できる柔軟性を兼ね備えた、Pythonの中でも特徴的なデータ型だといえるでしょう。

レベルを更に上げたい方はpaizaプログラミングスキルチェックへ

  1. paizaラーニングトップ
  2. リファレンス
  3. Pythonのリファレンス記事一覧
  4. Python bytearrayの使い方