デジタルトレンドナビ
システム開発

2024.06.14

Pythonのstructモジュールを使ったデータ構造の基本

Pythonのstructモジュールは、C言語の構造体のようにデータをパックし、アンパックするためのモジュールです。バイトデータを操作するために非常に便利であり、ネットワークプログラミングやバイナリファイルの操作に頻繁に使用されます。

本記事では、structモジュールの基本から使い方、実践例までを詳しく解説します。

structモジュールとは?

structモジュールはPythonの標準ライブラリの一部であり、バイトデータのパッキング(pack)とアンパッキング(unpack)をサポートしています。これにより、C言語の構造体のようにデータを効率的に操作することができます。

structモジュールの基本

structモジュールは、さまざまなデータ型をバイト形式に変換する機能を提供します。以下のようなデータ型に対応しています。

  • c: char(1バイト)
  • b: signed char(1バイト)
  • B: unsigned char(1バイト)
  • ?: _Bool(1バイト)
  • h: short(2バイト)
  • H: unsigned short(2バイト)
  • i: int(4バイト)
  • I: unsigned int(4バイト)
  • l: long(4バイト)
  • L: unsigned long(4バイト)
  • q: long long(8バイト)
  • Q: unsigned long long(8バイト)
  • f: float(4バイト)
  • d: double(8バイト)

なぜstructモジュールを使うのか?

structモジュールを使う主な理由は、バイナリデータの操作が必要な場合に便利だからです。たとえば、ネットワークを通じてデータを送受信する際や、バイナリファイルを読み書きする際に使用されます。Pythonの標準データ型だけではなく、C言語のような低レベルの操作が必要な場合に特に有用です。

structモジュールの使い方

structモジュールの基本的な使い方を学びましょう。ここでは、モジュールのインポート方法から、実際にデータをパック(pack)およびアンパック(unpack)する方法について説明します。

structモジュールのインポート

まず、structモジュールを使用するために、Pythonのコードにインポートする必要があります。これは以下のように行います。

[python]

import struct

これで、structモジュールの関数やメソッドを使用できるようになります。

pack関数とunpack関数の使い方

structモジュールの中心的な機能であるpack関数とunpack関数について詳しく見ていきましょう。

pack関数

pack関数は、指定されたフォーマットに従ってデータをバイト列に変換します。以下は基本的な使用例です。

[python]

import struct

# 整数をバイト列に変換
packed_data = struct.pack('i', 1024)
print(packed_data)

上記のコードでは、’i’は整数を表し、1024をバイト形式にパックしています。出力結果はバイト列(例えば、b’\x00\x04\x00\x00’)となります。

unpack関数

unpack関数は、バイト列を指定されたフォーマットに従ってデータに変換します。以下は基本的な使用例です。

[python]

import struct

# バイト列を整数に変換
unpacked_data = struct.unpack('i', packed_data)
print(unpacked_data)

このコードでは、先ほどパックしたバイト列を再び整数にアンパックしています。出力結果はタプル(例えば、(1024,))となります。

以下は、pack関数とunpack関数の概念を視覚的に示したものです。

pack(format, v1, v2, …): フォーマット文字列に従って、引数v1, v2, …をバイト列にパックします。

unpack(format, buffer): フォーマット文字列に従って、バッファからバイト列をアンパックし、タプルとして返します。

フォーマット文字列は、以下のようなデータ型を表す文字の組み合わせで構成されます。

文字説明
cchar(1バイト)
bsigned char(1バイト)
Bunsigned char(1バイト)
?_Bool(1バイト)
hshort(2バイト)
Hunsigned short(2バイト)
iint(4バイト)
Iunsigned int(4バイト)
llong(4バイト)
Lunsigned long(4バイト)
qlong long(8バイト)
Qunsigned long long(8バイト)
ffloat(4バイト)
ddouble(8バイト)

pack関数とunpack関数を使用することで、効率的にデータをバイト列として操作できるようになります。

structモジュールの実践例

structモジュールの基本的な使い方を理解したところで、実際の使用例を見てみましょう。ここでは、基本的な例と応用的な例の両方を紹介します。

基本的な使い方の例

まずは、基本的な使用例として、整数と浮動小数点数をバイト列にパックし、それをアンパックする方法を見てみましょう。

[python]

import struct

# 整数と浮動小数点数をパック
packed_data = struct.pack('if', 1024, 3.14)
print("パックされたデータ:", packed_data)

# バイト列をアンパック
unpacked_data = struct.unpack('if', packed_data)
print("アンパックされたデータ:", unpacked_data)

上記のコードでは、’if’フォーマット文字列を使用して、整数(1024)と浮動小数点数(3.14)をパックしています。その後、パックされたバイト列をアンパックし、元のデータに戻しています。

[出力例]

パックされたデータ: b'\x00\x04\x00\x00\xc3\xf5H@'
アンパックされたデータ: (1024, 3.140000104904175)

応用的な使い方の例

次に、もう少し複雑な例として、複数のデータ型を含む構造体をパックおよびアンパックする方法を見てみましょう。

[python]

import struct

# 複数のデータ型をパック
packed_data = struct.pack('i4sf', 1, b'test', 2.7)
print("パックされたデータ:", packed_data)

# バイト列をアンパック
unpacked_data = struct.unpack('i4sf', packed_data)
print("アンパックされたデータ:", unpacked_data)

このコードでは、’i4sf’フォーマット文字列を使用して、整数(1)、4バイトの文字列(b’test’)、および浮動小数点数(2.7)をパックしています。その後、パックされたバイト列をアンパックし、元のデータに戻しています。

[出力例]

パックされたデータ: b'\x01\x00\x00\x00test\xcd\xcc,@'
アンパックされたデータ: (1, b'test', 2.700000047683716)

まとめ

今回の記事では、Pythonのstructモジュールについて詳しく解説しました。structモジュールは、バイトデータのパッキングとアンパッキングを行うための強力なツールであり、特にネットワークプログラミングやバイナリファイルの操作において非常に便利です。

投稿者

  • デジタルトレンドナビ編集部

    システム開発、Webサイト制作、ECサイトの構築・運用、デジタルトランスフォーメーション(DX)など、デジタルビジネスに関わる多岐の領域において、最新のトレンド情報や実践的なノウハウを発信してまいります。