Python讀寫二進制文件的實現(xiàn)
1. 簡介
Python 讀寫文件的二進制數(shù)據(jù)需要使用到struct模塊,進行C/C++與Python數(shù)據(jù)格式的轉(zhuǎn)換。
2. struct模塊介紹
struct模塊中最常用的函數(shù)為pack和unpack,用法如下:
| 函數(shù) | return | explain |
|---|---|---|
| pack(fmt,v1,v2…) | string | 按照給定的格式(fmt),把數(shù)據(jù)轉(zhuǎn)換成字符串(字節(jié)流),并將該字符串返回. |
| pack_into(fmt,buffer,offset,v1,v2…) | None | 按照給定的格式(fmt),將數(shù)據(jù)轉(zhuǎn)換成字符串(字節(jié)流),并將字節(jié)流寫入以offset開始的buffer中.(buffer為可寫的緩沖區(qū),可用array模塊) |
| unpack(fmt,v1,v2……) | tuple | 按照給定的格式(fmt)解析字節(jié)流,并返回解析結(jié)果 |
| pack_from(fmt,buffer,offset) | tuple | 按照給定的格式(fmt)解析以offset開始的緩沖區(qū),并返回解析結(jié)果 |
| calcsize(fmt) | size of fmt | 計算給定的格式(fmt)占用多少字節(jié)的內(nèi)存,注意對齊方式 |
3. struct模塊中數(shù)據(jù)格式fmt對應(yīng)C/C++和Python中的類型
| Format | C Type | Python type | Standard size |
|---|---|---|---|
| x | pad byte | no value | |
| c | char | string of length | 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 | unsigned long | integer | 4 |
| q | long long | integer | 8 |
| Q | unsigned long long | 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個字節(jié)的整數(shù)(值為12345)
? ? int_value = 12345
? ? f.write(struct.pack("<i", int_value))
? ? # 寫入8個字節(jié)的雙精度浮點數(shù)(值為3.14159)
? ? double_value = 3.14159
? ? f.write(struct.pack("<d", double_value))
? ? # 寫入一個字節(jié)的布爾值(值為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))
? ? # 寫入一個定長字節(jié)數(shù)組(20個字節(jié),值為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個字節(jié),解析成一個整數(shù)
? ? int_value = struct.unpack("<i", f.read(4))[0]
? ??
? ? # 讀取8個字節(jié),解析成一個雙精度浮點數(shù)
? ? double_value = struct.unpack("<d", f.read(8))[0]
? ? # 讀取一個字節(jié),解析成一個布爾值
? ? bool_value = struct.unpack("<?", f.read(1))[0]
? ? # 讀取一個字符串,解析成一個定長字符串(10個字符)
? ? string_value = struct.unpack("<5s", f.read(5))[0].decode("utf-8")
? ? # 讀取一個字節(jié)數(shù)組,解析成一個定長字節(jié)數(shù)組(20個字節(jié))
? ? byte_array_value = struct.unpack("<20s", f.read(20))[0]
? ? # 打印結(jié)果
? ? 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格式進行編碼,一般用在中文字符串前面,防止因為源碼儲存格式問題,導(dǎo)致再次使用時出現(xiàn)亂碼。
str= u'hello'
5.2. 字符串前加r
去掉反斜杠的轉(zhuǎn)移機制。(特殊字符:即那些,反斜杠加上對應(yīng)字母,表示對應(yīng)的特殊含義的,比如最常見的”\n”表示換行,”\t”表示Tab等。 )
str= r'hello\n\t\n'
5.3. 字符串前加b
表示該字符串是bytes 類型。
bytes = b'hello'
在 Python3 中,bytes 和 str 的互相轉(zhuǎn)換方式是
str.encode(‘utf-8') bytes.decode(‘utf-8')
5.4. 字符串前加f
以 f 開頭表示在字符串內(nèi)支持大括號內(nèi)的python 表達式,字符串拼接
name = 'Lily'
print(f'My name is {name}.')
參考
[1] python3中的struct模塊使用
[2] Python 字符串前面加u,r,b,f的含義
到此這篇關(guān)于Python讀寫二進制文件的實現(xiàn)的文章就介紹到這了,更多相關(guān)Python讀寫二進制文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python使用Appium在移動端抓取微博數(shù)據(jù)的實現(xiàn)
Appium是移動端的自動化測試工具,讀者可以類比為PC端的selenium。通過它,我們可以驅(qū)動App完成自動化的一系列操作,同樣也可以爬取需要的內(nèi)容,本文就來介紹一下如何在移動端抓取微博數(shù)據(jù),感興趣的可以了解一下2021-08-08
PyCharm插件開發(fā)實踐之PyGetterAndSetter詳解
這篇文章主要介紹了PyCharm插件開發(fā)實踐-PyGetterAndSetter,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-10-10
python字典如何獲取最大和最小value對應(yīng)的key
這篇文章主要介紹了python字典如何獲取最大和最小value對應(yīng)的key問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-11-11
TensorFlow實現(xiàn)模型斷點訓(xùn)練,checkpoint模型載入方式
這篇文章主要介紹了TensorFlow實現(xiàn)模型斷點訓(xùn)練,checkpoint模型載入方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05

