Pythonのbytes()関数を徹底解説!バイナリデータの扱い方

フリーランスボード

20万件以上の案件から、副業に最適なリモート・週3〜の案件を一括検索できるプラットフォーム。プロフィール登録でAIスカウトが自動的にマッチング案件を提案。市場統計や単価相場、エージェントの口コミも無料で閲覧可能なため、本業を続けながら効率的に高単価の副業案件を探せます。フリーランスボード

ITプロパートナーズ

週2〜3日から働ける柔軟な案件が業界トップクラスの豊富さを誇るフリーランスエージェント。エンド直契約のため高単価で、週3日稼働でも十分な報酬を得られます。リモートや時間フレキシブルな案件も多数。スタートアップ・ベンチャー中心で、トレンド技術を使った魅力的な案件が揃っています。専属エージェントが案件紹介から契約交渉までサポート。利用企業2,000社以上の実績。ITプロパートナーズ

Midworks 10,000件以上の案件を保有し、週3日〜・フルリモートなど柔軟な働き方に対応。高単価案件が豊富で、報酬保障制度(60%)や保険料負担(50%)など正社員並みの手厚い福利厚生が特徴。通勤交通費(月3万円)、スキルアップ費用(月1万円)の支給に加え、リロクラブ・freeeが無料利用可能。非公開案件80%以上、支払いサイト20日で安心して稼働できます。Midworks

Pythonでファイルやネットワーク通信を扱う際、テキストデータだけでなくバイナリデータを処理する必要がしばしばあります。画像ファイル、音声ファイル、暗号化されたデータ、あるいは低レベルなネットワークプロトコルなど、これらはすべてバイナリデータとして扱われます。Pythonでこのようなバイナリデータを操作するために欠かせないのが**bytes()関数**です。この記事では、bytes()関数の基本的な使い方から、文字列との違い、具体的な活用事例までを初心者にもわかりやすく解説します。

bytes()関数とは?Pythonにおけるバイト列の生成

Pythonのbytes()関数は、バイト列(bytes object)を生成するための組み込み関数です。バイト列は、0から255までの整数値(バイト)のシーケンスであり、テキストデータのように文字エンコーディングの影響を受けません。ファイルI/Oやネットワーク通信など、データの実際の「生の」表現を扱う際に用いられます。

文字列とバイト列の違い

Pythonにおける文字列(str型)は、Unicode文字のシーケンスであり、人間が読むテキストを表します。これに対し、バイト列(bytes型)は、生のバイト(0〜255の整数値)のシーケンスであり、コンピュータが扱うデータそのものを表します。

特徴 str (文字列) bytes (バイト列)
目的 テキスト(Unicode文字) バイナリデータ(バイト)
表現方法 "' で囲む(例: "Hello" b"b' で囲む(例: b"Hello"
各要素の値 文字 0〜255の整数値
エンコーディング 必要(encode()/decode() 不要

bytes()関数の基本的な使い方

bytes()関数は、さまざまな引数を受け取り、バイト列を生成します。

1. 空のバイト列の生成

引数を指定しない場合、空のバイト列を生成します。

Python
 
empty_bytes = bytes()
print(empty_bytes) # 出力: b''
print(type(empty_bytes)) # 出力: <class 'bytes'>

2. サイズを指定してヌルバイトで初期化

整数を1つ引数に指定すると、その数だけ\x00(ヌルバイト)で埋められたバイト列を生成します。

Python
 
ten_null_bytes = bytes(10)
print(ten_null_bytes) # 出力: b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
print(len(ten_null_bytes)) # 出力: 10

3. イテラブル(リストやタプルなど)から生成

0から255までの整数を含むイテラブル(リストやタプルなど)を引数に指定すると、その数値に対応するバイト列を生成します。

Python
 
# リストからバイト列を生成
byte_list = [72, 101, 108, 108, 111] # H, e, l, l, o のASCIIコード
hello_bytes = bytes(byte_list)
print(hello_bytes) # 出力: b'Hello'

# タプルからバイト列を生成
byte_tuple = (255, 0, 128)
rgb_bytes = bytes(byte_tuple)
print(rgb_bytes) # 出力: b'\xff\x00\x80'

注意点: イテラブルの要素が0〜255の範囲外の数値だとValueErrorが発生します。

Python
 
# error_bytes = bytes([256]) # ValueError: bytes must be in range(0, 256)

4. 文字列からエンコーディングを指定して生成

文字列をバイト列に変換する際、bytes()関数に文字列とエンコーディング(例: 'utf-8''shift_jis')を引数で渡します。

Python
 
# UTF-8でエンコード
s_utf8 = "こんにちは"
encoded_bytes_utf8 = bytes(s_utf8, 'utf-8')
print(encoded_bytes_utf8) # 出力: b'\xe3\x81\x93\xe3\x82\x93\xe3\x81\xab\xe3\x81\xa1\xe3\x81\xaf'

# Shift-JISでエンコード
s_sjis = "こんにちは"
encoded_bytes_sjis = bytes(s_sjis, 'shift_jis')
print(encoded_bytes_sjis) # 出力: b'\x82\xb1\x82\xda\x82\xbf\x82\xcd\x82\xa2'

これは、文字列オブジェクトの.encode()メソッドを使用するのと本質的に同じです。通常は.encode()メソッドの利用が推奨されます。

Python
 
# .encode()メソッドの使用例
s = "Python"
encoded_by_method = s.encode('utf-8')
print(encoded_by_method) # 出力: b'Python'

バイト列の操作

バイト列は、文字列と同様に多くの操作が可能です。

インデックスとスライス

個々のバイトにアクセスしたり、部分的なバイト列を取り出したりできます。インデックスでアクセスすると整数値が返されます。

Python
 
data = b"Python"
print(data[0])    # 出力: 80 (PのASCIIコード)
print(data[1:4])  # 出力: b'yth'

結合

+演算子や.join()メソッドで結合できます。

Python
 
b1 = b"Hello"
b2 = b"World"
combined_bytes = b1 + b" " + b2
print(combined_bytes) # 出力: b'Hello World'

検索・置換

.find().replace()などのメソッドも利用できます。

Python
 
search_bytes = b"Hello World"
print(search_bytes.find(b"World")) # 出力: 6

bytes()関数の活用事例

1. ファイルI/O(バイナリモード)

画像や音声、実行可能ファイルなど、テキストとして解釈できないファイルを読み書きする際には、ファイルをバイナリモード('rb''wb')で開く必要があります。このとき、読み書きされるデータはバイト列になります。

Python
 
# バイナリファイルの書き込み例
with open("image_data.bin", "wb") as f:
    f.write(bytes([0xFF, 0xD8, 0xFF, 0xE0, 0x00, 0x10, 0x4A, 0x46])) # JPEGのヘッダーの一部

# バイナリファイルの読み込み例
with open("image_data.bin", "rb") as f:
    header = f.read(8) # 最初の8バイトを読み込む
    print(header) # 出力: b'\xff\xd8\xff\xe0\x00\x10JF'

2. ネットワーク通信

HTTPリクエストやソケット通信など、ネットワークプロトコルは通常、バイト列でデータを送受信します。

Python
 
# ネットワーク経由で送信するデータ(簡略例)
message = "Hello Server!"
encoded_message = message.encode('utf-8') # 文字列をバイト列にエンコード
# socket.send(encoded_message) # 実際の送信処理(ソケットプログラミング)
print(f"送信データ: {encoded_message}")

3. 暗号化とハッシュ化

データの暗号化やハッシュ値を計算するライブラリ(hashlibなど)は、入力としてバイト列を要求します。

Python
 
import hashlib

data_to_hash = "my_secret_data".encode('utf-8') # 文字列をバイト列に変換
sha256_hash = hashlib.sha256(data_to_hash).hexdigest()
print(f"SHA256ハッシュ値: {sha256_hash}")

4. バイナリプロトコルの解析

独自のバイナリフォーマットや通信プロトコルを解析する際、バイト列を直接操作して特定の位置のバイトを読み取ったり、構造体に変換したりします。

bytes()関数と関連する関数・型

bytearray()

bytearray()bytes型と同様にバイト列を扱いますが、**ミュータブル(変更可能)**である点が異なります。一度作成したバイト列を変更したい場合にbytearrayを使用します。

Python
 
mutable_bytes = bytearray(b"abc")
print(mutable_bytes) # 出力: bytearray(b'abc')
mutable_bytes[0] = 74 # 'a' (97) を 'J' (74) に変更
print(mutable_bytes) # 出力: bytearray(b'Jbc')

.decode()メソッド

バイト列を文字列に戻す(デコードする)際には、バイト列オブジェクトの.decode()メソッドを使用します。この際も、エンコーディングを指定する必要があります。

Python
 
encoded_data = b'\xe3\x81\x93\xe3\x82\x93\xe3\x81\xab\xe3\x81\xa1\xe3\x81\xaf' # "こんにちは"のUTF-8バイト列
decoded_string = encoded_data.decode('utf-8')
print(decoded_string) # 出力: こんにちは

まとめ

Pythonのbytes()関数は、コンピュータが直接扱う生のデータであるバイト列を生成し、操作するための非常に重要なツールです。文字列との違いを理解し、適切に使い分けることで、ファイルI/O、ネットワーク通信、データ暗号化といった幅広いバイナリデータ処理を効率的に行えます。

  • bytes()関数はバイト列を生成します。

  • バイト列は0〜255の整数値のシーケンスで、生のバイナリデータを表します。

  • 文字列(str)とは異なり、エンコーディングは「データ化」の際に考慮されます。

  • ファイルI/Oのバイナリモード、ネットワーク通信、暗号化などで不可欠です。

  • .encode()で文字列からバイト列へ、.decode()でバイト列から文字列へ変換します。

  • 変更可能なバイト列が必要な場合はbytearray()を使用します。

この知識を身につけることで、Pythonでより多様な種類のデータを扱う能力が向上するでしょう。


「らくらくPython塾」が切り開く「呪文コーディング」とは?

■プロンプトだけでオリジナルアプリを開発・公開してみた!!

■AI時代の第一歩!「AI駆動開発コース」はじめました!

テックジム東京本校で先行開始。

■テックジム東京本校

「武田塾」のプログラミング版といえば「テックジム」。
講義動画なし、教科書なし。「進捗管理とコーチング」で効率学習。
より早く、より安く、しかも対面型のプログラミングスクールです。

<短期講習>5日で5万円の「Pythonミニキャンプ」開催中。

<月1開催>放送作家による映像ディレクター養成講座

<オンライン無料>ゼロから始めるPython爆速講座

フリーランスボード

20万件以上の案件から、副業に最適なリモート・週3〜の案件を一括検索できるプラットフォーム。プロフィール登録でAIスカウトが自動的にマッチング案件を提案。市場統計や単価相場、エージェントの口コミも無料で閲覧可能なため、本業を続けながら効率的に高単価の副業案件を探せます。フリーランスボード

ITプロパートナーズ

週2〜3日から働ける柔軟な案件が業界トップクラスの豊富さを誇るフリーランスエージェント。エンド直契約のため高単価で、週3日稼働でも十分な報酬を得られます。リモートや時間フレキシブルな案件も多数。スタートアップ・ベンチャー中心で、トレンド技術を使った魅力的な案件が揃っています。専属エージェントが案件紹介から契約交渉までサポート。利用企業2,000社以上の実績。ITプロパートナーズ

Midworks 10,000件以上の案件を保有し、週3日〜・フルリモートなど柔軟な働き方に対応。高単価案件が豊富で、報酬保障制度(60%)や保険料負担(50%)など正社員並みの手厚い福利厚生が特徴。通勤交通費(月3万円)、スキルアップ費用(月1万円)の支給に加え、リロクラブ・freeeが無料利用可能。非公開案件80%以上、支払いサイト20日で安心して稼働できます。Midworks