Pythonにおけるbytesとbytearrayの完全ガイド:基本から応用まで

Pythonのbytes型とbytearray型は、バイナリデータを扱うための重要な機能です。ネットワーク通信、ファイル操作、暗号化など、様々な場面で活躍します。本記事では、bytes型とbytearray型の基本から応用まで、その違いを含めて網羅的に解説していきます。

bytesとbytearrayの基本

bytes

bytes型は、0から255までの整数値を要素として持つ不変のシーケンスです。
主にバイナリデータの表現に使用されます。

bytearray

bytearray型は、bytes型と同様に0から255までの整数値を要素として持ちますが、可変(ミュータブル)なシーケンスです。

bytesとbytearrayの主な違い

  1. 可変性: bytes型は不変(イミュータブル)であるのに対し、bytearray型は可変(ミュータブル)です。
  2. パフォーマンス: 大量のデータを扱う場合、bytes型の方が一般的に高速です。
  3. 用途: bytes型は読み取り専用のバイナリデータに適しており、bytearray型は動的に変更が必要なバイナリデータに適しています。

作成方法

bytes型の作成

# バイトリテラルを使用
b1 = b'Hello'

# bytes()コンストラクタを使用
b2 = bytes([72, 101, 108, 108, 111])

# 文字列をエンコード
s = 'Hello'
b3 = s.encode('utf-8')

bytearray型の作成

# 空のbytearray
ba1 = bytearray()

# サイズを指定して初期化
ba2 = bytearray(5)

# イテラブルから作成
ba3 = bytearray([72, 101, 108, 108, 111])

# 文字列から作成
ba4 = bytearray('Hello', 'utf-8')

操作と変換

bytesの操作

b = b'Hello, World!'
print(b[7:12])  # b'World'

bytearrayの操作

ba = bytearray(b'Hello')
ba[0] = 74  # 'H' を 'J' に変更
ba.append(33)  # '!' を追加
ba.extend(b' World')  # 文字列を追加
print(ba.decode('utf-8'))  # 'Jello! World'

ファイル操作での使用例

bytesを使用したバイナリファイルの読み込み

with open('binary.dat', 'rb') as f:
    content = f.read()  # bytes型で読み込まれる

bytearrayを使用したバイナリファイルの編集

with open('binary.dat', 'rb') as f:
    content = bytearray(f.read())
content[0] = 255  # 最初のバイトを変更
with open('binary.dat', 'wb') as f:
    f.write(content)

応用例

ネットワーク通信での使用

import socket

# サーバーサイド
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('localhost', 8888))
server.listen(1)

conn, addr = server.accept()
data = conn.recv(1024)  # bytes型で受信
modified_data = bytearray(data)
modified_data[0] = 65  # 最初のバイトを'A'に変更
conn.send(modified_data)

暗号化での使用

from cryptography.fernet import Fernet

key = Fernet.generate_key()
f = Fernet(key)

message = b"Secret message"
encrypted = f.encrypt(message)  # bytes型で暗号化
decrypted = f.decrypt(encrypted)  # bytes型で復号

まとめ

bytes型とbytearray型は、Pythonでバイナリデータを扱う上で非常に強力なツールです。bytes型は不変で読み取り専用のデータに適しており、bytearray型は可変で動的な操作が必要なデータに適しています。用途に応じて適切な型を選択することで、効率的なバイナリデータ処理が可能になります。ネットワーク通信、ファイル操作、暗号化など、様々な場面でこれらの型を活用することで、より柔軟で効果的なプログラミングが実現できるでしょう。

にいやん

出身 : 関西 居住区 : 関西 職業 : 組み込み機器エンジニア (エンジニア歴13年) 年齢 : 38歳(2022年11月現在) 最近 業務の効率化で噂もありPython言語に興味を持ち勉強しています。 そこで学んだことを記事にして皆さんとシェアさせていただければと思いブログをはじめました!! 興味ある記事があれば皆さん見ていってください!! にほんブログ村