每週乙個 Python 標準庫 struct

2021-10-02 08:12:27 字數 4877 閱讀 7505

技術部落格:

structs 支援將資料打包成字串,並使用格式說明符從字串中解壓縮資料,格式說明符由表示資料型別的字元、可選計數和位元組順序指示符組成。有關支援的格式說明符的完整列表,請參閱標準庫文件。

在此示例中,說明符呼叫整數或長整數值,雙位元組字串和浮點數。格式說明符中的空格用作分隔型別指示符,並在編譯格式時忽略。

import struct

import binascii

values =(1

,'ab'

.encode(

'utf-8'),

2.7)

s = struct.struct(

'i 2s f'

)packed_data = s.pack(

*values)

print

('original values:'

, values)

print

('format string :'

, s.

format

)print

('uses :'

, s.size,

'bytes'

)print

('packed value :'

, binascii.hexlify(packed_data)

)# output

# original values: (1, b'ab', 2.7)

# format string : b'i 2s f'

# uses : 12 bytes

# packed value : b'0100000061620000cdcc2c40'

該示例使用函式binascii.hexlify()將打包值轉換為十六進製制位元組序列以進行列印。

unpack()從打包中提取資料。

import struct

import binascii

packed_data = binascii.unhexlify(b'0100000061620000cdcc2c40'

)s = struct.struct(

'i 2s f'

)unpacked_data = s.unpack(packed_data)

print

('unpacked values:'

, unpacked_data)

# output

# unpacked values: (1, b'ab', 2.700000047683716)

將打包值傳遞給unpack(),返回基本相同的值(注意浮點值的差異)。

預設情況下,使用本機 c 庫的位元組序對值進行編碼 。通過在格式字串中提供顯式位元組序指令,可以輕鬆覆蓋該選項。

import struct

import binascii

values =(1

,'ab'

.encode(

'utf-8'),

2.7)

print

('original values:'

, values)

endianness =[(

'@',

'native, native'),

('='

,'native, standard'),

('<'

,'little-endian'),

('>'

,'big-endian'),

('!'

,'network'),

]for code, name in endianness:

s = struct.struct(code +

' i 2s f'

) packed_data = s.pack(

*values)

print()

print

('format string :'

, s.

format

,'for'

, name)

print

('uses :'

, s.size,

'bytes'

)print

('packed value :'

, binascii.hexlify(packed_data)

)print

('unpacked value :'

, s.unpack(packed_data)

)# output

# original values: (1, b'ab', 2.7)

# # format string : b'@ i 2s f' for native, native

# uses : 12 bytes

# packed value : b'0100000061620000cdcc2c40'

# unpacked value : (1, b'ab', 2.700000047683716)

# # format string : b'= i 2s f' for native, standard

# uses : 10 bytes

# packed value : b'010000006162cdcc2c40'

# unpacked value : (1, b'ab', 2.700000047683716)

# # format string : b'< i 2s f' for little-endian

# uses : 10 bytes

# packed value : b'010000006162cdcc2c40'

# unpacked value : (1, b'ab', 2.700000047683716)

# # format string : b'> i 2s f' for big-endian

# uses : 10 bytes

# packed value : b'000000016162402ccccd'

# unpacked value : (1, b'ab', 2.700000047683716)

# # format string : b'! i 2s f' for network

# uses : 10 bytes

# packed value : b'000000016162402ccccd'

# unpacked value : (1, b'ab', 2.700000047683716)

使用二進位制打包資料通常用於對效能要求較高的場景或將資料傳入和傳出擴充套件模組。通過避免為每個打包結構分配新緩衝區,可以優化這些情況。pack_into()unpack_from()方法支援直接寫入預先分配的緩衝區。

import array

import binascii

import ctypes

import struct

s = struct.struct(

'i 2s f'

)values =(1

,'ab'

.encode(

'utf-8'),

2.7)

print

('original:'

, values)

print()

print

('ctypes string buffer'

)b = ctypes.create_string_buffer(s.size)

print

('before :'

, binascii.hexlify(b.raw)

)s.pack_into(b,0,

*values)

print

('after :'

, binascii.hexlify(b.raw)

)print

('unpacked:'

, s.unpack_from(b,0)

)print()

print

('array'

)a = array.array(

'b', b'\0'

* s.size)

print

('before :'

, binascii.hexlify(a)

)s.pack_into(a,0,

*values)

print

('after :'

, binascii.hexlify(a)

)print

('unpacked:'

, s.unpack_from(a,0)

)# output

# original: (1, b'ab', 2.7)

# # ctypes string buffer

# before : b'000000000000000000000000'

# after : b'0100000061620000cdcc2c40'

# unpacked: (1, b'ab', 2.700000047683716)

# # array

# before : b'000000000000000000000000'

# after : b'0100000061620000cdcc2c40'

# unpacked: (1, b'ab', 2.700000047683716)

size屬性告訴我們緩衝區需要多大。

每週乙個 Python 標準庫 glob

技術部落格 儘管globapi 不多,但該模組具有很強的功能。當程式需要通過名稱與模式匹配的方式查詢檔案列表時,它很有用。要建立乙個檔案列表,這些檔名具有特定的副檔名,字首或中間的任何公共字串,這個時候,使用glob而不是編寫自定義 來掃瞄目錄內容。glob模式規則與re模組使用的正規表示式不同。相...

每週乙個 Python 模組 string

每週乙個 python 模組 目的 包含用於處理文字的常量和類。string 模組可以追溯到最早的 python 版本。先前在此模組中實現的許多功能已移至 str 物件方法。string 模組保留了幾個有用的常量和類來處理 str 物件。直接看下面的事例 import string s the qu...

每週乙個 Python 模組 fnmatch

每週乙個 python 模組 fnmatch 模組主要用於檔名的比較,使用 unix shell 使用的 glob 樣式模式。fnmatch 將單個檔名與模式進行比較並返回布林值,來看它們是否匹配。當作業系統使用區分大小寫的檔案系統時,比較區分大小寫。import fnmatch import os...