1. はじめに
Python は、C/C および Python データ形式を変換するために、ファイルのバイナリ データを読み書きするために struct モジュールを使用する必要があります。
2. struct モジュールの概要
struct モジュールで最も一般的に使用される関数は、pack と unpack です。使用方法は次のとおりです:
関数 |
return |
explain |
pack(fmt,v1,v2…) | # #string | 指定された形式 (fmt) に従ってデータを文字列 (バイト ストリーム) に変換し、文字列を返します。 |
##pack_into(fmt,buffer,offset 、v1、v2...)
None |
指定された形式 (fmt) に従ってデータを文字列 (バイト ストリーム) に変換し、オフセットから始まるバイト ストリームをバッファに書き込みます. (buffer は書き込み可能なバッファであり、配列モジュールが使用できます) |
|
unpack(fmt,v1,v2……)
tuple |
指定された形式 (fmt) に従ってバイト ストリームを解析し、解析結果を返します |
| ##pack_from(fmt,buffer,offset)
tuple | 指定された形式 (fmt) に従ってオフセットで始まるバッファを解析し、解析結果を返します | #calcsize(fmt)#fmt のサイズ |
指定された形式 (fmt) が占めるメモリのバイト数を計算し、アライメントに注意してください
|
| 3. struct モジュールのデータ形式 fmt は C/C に対応しますと Python の入力 |
形式
C タイプ
Python タイプ
標準サイズ |
|
|
xx |
パッドバイト
値なし
|
|
| c
char |
長さの文字列
1 |
|
b |
signed char |
integer
1 |
|
B |
unsigned char |
integer
1 |
|
? |
_Bool |
bool
1 |
| ##h | short | integer
#2
|
H |
unsigned short |
integer |
2
|
i |
int |
integer |
4
| ##I | unsigned int | integer | 4
| l | long | integer | 4
| L | 符号なしlong | 整数 | 4
| q | long long | integer | 8
| Q | unsignedlonglong | integer | 8
f |
float |
float |
4 |
d |
double |
float |
8 |
s |
char[] |
string |
|
#p |
char[] |
string |
|
P |
void * |
integer |
|
##4.例 |
注意: コード内の < はリトル エンディアンを意味し、> はビッグ エンディアンを意味します | import struct
# 打开文件
with open("binary_file.bin", "wb") as f:
# 写入4个字节的整数(值为12345)
int_value = 12345
f.write(struct.pack("<i", int_value))
# 写入8个字节的双精度浮点数(值为3.14159)
double_value = 3.14159
f.write(struct.pack("<d", double_value))
# 写入一个字节的布尔值(值为True)
bool_value = True
f.write(struct.pack("<?", bool_value))
# 写入一个定长字符串(10个字符,值为"hello")
string_value = "hello".encode("utf-8")
f.write(struct.pack("<5s", string_value))
# 写入一个定长字节数组(20个字节,值为b"\x01\x02\x03...\x14")
byte_array_value = bytes(range(1, 21))
f.write(struct.pack("<20s", byte_array_value))
f.close()
# 打开文件
with open("binary_file.bin", "rb") as f:
# 读取4个字节,解析成一个整数
int_value = struct.unpack("<i", f.read(4))[0]
# 读取8个字节,解析成一个双精度浮点数
double_value = struct.unpack("<d", f.read(8))[0]
# 读取一个字节,解析成一个布尔值
bool_value = struct.unpack("<?", f.read(1))[0]
# 读取一个字符串,解析成一个定长字符串(10个字符)
string_value = struct.unpack("<5s", f.read(5))[0].decode("utf-8")
# 读取一个字节数组,解析成一个定长字节数组(20个字节)
byte_array_value = struct.unpack("<20s", f.read(20))[0]
# 打印结果
print(f"int_value: {int_value}")
print(f"double_value: {double_value}")
print(f"bool_value: {bool_value}")
print(f"string_value: {string_value}")
print(f"byte_array_value: {byte_array_value}")
f.close()
ログイン後にコピー
5. Python 文字列の前に u、r、b、f を追加する意味 | 5.1 . 文字列の前に u
| を追加すると、次の文字列が Unicode 形式でエンコードされます。ソース コードの保存形式の問題による再使用時の文字化けを防ぐために、通常は中国語の文字列の前に使用されます。
str= u'hello'
ログイン後にコピー
5.2. バックスラッシュ転送メカニズムを削除するには、文字列の前に r
を追加します。 (特殊文字: バックスラッシュと対応する文字で、対応する特別な意味を示します。たとえば、最も一般的な「\n」は改行を意味し、「\t」はタブを意味します。)
str= r'hello\n\t\n'
ログイン後にコピー
5.3 . 文字列の前に b
を追加すると、文字列がバイト型であることを示します。
bytes = b'hello'
ログイン後にコピー
Python3 では、bytes と str の間の相互変換メソッドは
str.encode(‘utf-8')
bytes.decode(‘utf-8')
ログイン後にコピー
5.4 です。文字列の前に f
を追加し、f で開始して、中かっこがサポートされていることを示します。文字列。Python 式、文字列連結
name = 'Lily'
print(f'My name is {name}.')
ログイン後にコピー
以上がPython を使用してバイナリ ファイルを読み書きする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。