この記事のポイント
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プログラミングスキルチェックへ