Pythonのbytes型とbytearray型とは?初心者向けにバイナリデータの扱い方を解説!
生徒
「先生、バイナリってよく聞くんですが、Pythonでどう扱えばいいんですか?」
先生
「Pythonでは、バイナリデータを扱うためにbytes型とbytearray型という2つのデータ型がありますよ!」
生徒
「その2つって何が違うんですか?初心者にも分かるように教えてください!」
先生
「もちろん!それでは、Pythonのバイナリデータの基本から丁寧に解説していきましょう!」
1. バイナリデータとは?
まずは「バイナリデータ」って何?というところから。バイナリデータとは、コンピューターが扱う「0と1」でできたデータのことです。文字や画像、音声も、実はすべてバイナリとして保存されています。
例えば画像ファイルを開くとき、Pythonは「文字」ではなく「バイナリ」として読み取ります。
2. bytes型とは?
bytes型は、読み取り専用のバイナリデータ型です。一度作ると変更できません(不変型)。
例えるなら「密封された箱」のようなものです。中身を見たりコピーすることはできますが、直接中身をいじることはできません。
b = bytes([65, 66, 67])
print(b)
b'ABC'
[65, 66, 67]は、それぞれA, B, Cを表すASCIIコードです。
3. bytearray型とは?
bytearray型は、変更可能なバイナリデータ型です。bytes型とは違い、あとから中身を書き換えることができます。
例えるなら「チャック付きの袋」のような感じです。あとから物を出し入れできます。
ba = bytearray([65, 66, 67])
ba[0] = 97
print(ba)
bytearray(b'aBC')
65を97に変えたことで、Aがaになっています。
4. bytes型とbytearray型の違い
- bytes型: 不変(変更できない)
- bytearray型: 可変(変更できる)
- どちらも: バイナリデータを扱うときに使う
文字データをバイナリに変換するにはencode()、バイナリを文字に戻すにはdecode()を使います。
5. encode()とdecode()の使い方
文字列(str型)をバイナリに変えるにはencode()を使います。逆に、バイナリから文字に戻すにはdecode()です。
s = "こんにちは"
b = s.encode("utf-8")
print(b)
print(b.decode("utf-8"))
b'\xe3\x81\x93\xe3\x82\x93\xe3\x81\xab\xe3\x81\xa1\xe3\x81\xaf'
こんにちは
utf-8は文字をバイナリに変換するための方式(文字コード)です。
6. バイナリデータはいつ使うの?
Pythonでバイナリデータを扱うのは、以下のような場面です:
- 画像ファイルや音声ファイルを読み書きするとき
- ネットワーク通信でデータを送受信するとき
- 暗号化や圧縮処理を行うとき
たとえば、画像ファイルを開くときはこんな風にします:
with open("image.png", "rb") as f:
data = f.read()
print(type(data))
<class 'bytes'>
7. bytearray型は便利!書き換えたいときに使おう
bytearray型は、ファイルから読み取ったデータを加工したいときにとても便利です。たとえば、特定のバイトだけ変更したいときなどです。
data = bytearray(b"Python")
data[0] = ord("J")
print(data.decode())
Jython
ord()は文字を数字に変換する関数です。
まとめ
Pythonでバイナリデータを扱うための基本として、bytes型とbytearray型の役割や違いを理解することはとても大切です。この記事では、バイナリデータがどのような場面で使われるのか、bytes型とbytearray型がどのように動作するのか、それぞれの特徴を丁寧に振り返りながら学んできました。コンピューターが扱う情報の多くは最終的にバイナリとして保存されるため、画像、音声、ネットワーク通信、暗号化、圧縮などの処理では必ずこの知識が役立ちます。特に初心者のうちは文字列とバイナリの違いが分かりづらいことが多いため、encodeやdecodeを使ってデータを適切な形に変換する流れをしっかり理解しておくことが重要になります。
bytes型は不変であり、作成したあとに中身を変更できないため、安全にデータを扱うことができます。一方、bytearray型は可変であり、バイト単位で自由に書き換えられます。どちらもバイナリを扱う上で欠かせない存在ですが、用途によって使い分けることで効率的で柔軟なプログラムを作ることができるようになります。また、bytearray型を使うと、ファイルから読み込んだデータをその場で加工することができるため、画像処理やデータ変換などの実践的な場面でも役立ちます。初心者であっても、実際に触れながら動きを確認すると理解がより深まり、バイナリの世界がぐっと身近になるはずです。
encodeとdecodeは文字とバイナリをつなぐとても重要な仕組みです。日本語などのマルチバイト文字を扱う場合、文字コードの違いでトラブルが起きやすいため、utf-8を使った変換処理の流れを覚えておくことは大きな助けになります。Pythonはバイナリ処理を直感的に書ける言語なので、bytes型やbytearray型を組み合わせることで安全かつ柔軟にデータを扱えるようになります。プログラムに触れれば触れるほど、これらの型を理解しているかどうかで大きな差が出てくることがわかるでしょう。
サンプルプログラムで総復習
最後に、bytes型とbytearray型をまとめて復習できる簡単なサンプルコードを紹介します。データの変換、変更、読み取りなど、これまで学んだ内容がどのようにつながるのかを確認してみましょう。
text = "バイナリデータの復習です"
bdata = text.encode("utf-8")
mutable = bytearray(bdata)
mutable[0] = ord("★")
print("元のバイナリ:", bdata)
print("変更後バイナリ:", mutable)
print("文字列に復元:", mutable.decode("utf-8"))
このサンプルのように、まず文字列をバイナリに変換し、その後bytearray型を使って特定のバイトだけを書き換えるといった処理を行うことで、bytes型とbytearray型の違いや活用方法が自然と理解できます。特にバイナリは目に見えにくいデータであるため、printで確認する習慣をつけると、どのように変化しているかを視覚的に把握できるようになります。
生徒
「bytes型とbytearray型の使い分けがよく分かりました!特に、変更できるかどうかの違いが大きいんですね。」
先生
「その通りです。バイナリデータは画像や音声、ネットワーク通信でもよく使われるので、可変か不変かを意識して選ぶことが大切ですよ。」
生徒
「encodeとdecodeの流れも分かってきました。バイナリのままだと読めないけれど、文字に戻すと意味が分かるのが面白いですね!」
先生
「そこに気づけたのは大きな進歩です。文字コードを理解すると、データトラブルを避けやすくなるので必ず役立ちますよ。」
生徒
「これから画像やファイルを扱うプログラムも作ってみたくなりました!」
先生
「とても良い姿勢ですね。今日学んだ型の特徴を意識しながら、ぜひたくさん挑戦していきましょう。」