Python 学习笔记(3)对txt文件的读与写操作(下)
? ?? ? ? ?上一章節我們討論了如何對txt文本文件進行讀寫操作,這一張將討論如何進行二進制文件的寫與讀。《Python 學習筆記(3)對txt文件的讀與寫操作(上)》的鏈接如下https://blog.csdn.net/yanchuan23/article/details/121069465https://blog.csdn.net/yanchuan23/article/details/121069465https://blog.csdn.net/yanchuan23/article/details/121069465?????
1、uint32數據轉換為4個字節
? ? ? ? 首先看下如何將uint32轉換為4個字節。
# 計算一個無符號32位數據的bytes表達 temp = [0] * 4 uintdata = 123456 for i in range(4):temp[i] = hex((uintdata >> i * 8) & 0xff)????????計算結果如下:
????????但是如果數據位浮點數這樣就行不通了。
????????可以用struct來解決bytes和其他二進制數據類型的轉換。
2、 struct模塊
????????struct的作用:將字節串解讀為打包的二進制數據。
????????該模塊執行Python值和以Python字節對象表示的C結構體之間的轉換。 這可以用于處理存儲在文件中的二進制數據或來自其他來源的網絡連接的二進制數據。 它使用格式字符串作為C結構布局的緊湊描述,以及與Python值的轉換。
2.1、struct模塊中的功能
| 函數 | return | explain |
| pack(fmt,v1,v2…) | string | 按照給定的格式(fmt),把數據轉換成字符串(字節流),并將該字符串返回. |
| pack_into(fmt,buffer,offset,v1,v2…) | None | 按照給定的格式(fmt),將數據轉換成字符串(字節流),并將字節流寫入以offset開始的buffer中.(buffer為可寫的緩沖區,可用array模塊) |
| unpack(fmt,v1,v2…..) | tuple | 按照給定的格式(fmt)解析字節流,并返回解析結果 |
| pack_from(fmt,buffer,offset) | tuple | 按照給定的格式(fmt)解析以offset開始的緩沖區,并返回解析結果 |
| calcsize(fmt) | size of fmt | 計算給定的格式(fmt)占用多少字節的內存,注意對齊方式 |
2.2、格式化字符串
????????當打包或者解包的時,需要按照特定的方式來打包或者解包。該方式就是格式化字符串,它指定了數據類型,除此之外,還有用于控制字節順序、大小和對齊方式的特殊字符。
2.2.1、字節順序、大小與對齊方式
????????為了同c中的結構體交換數據,還要考慮c或c++編譯器使用了字節對齊,通常是以4個字節為單位,故而struct根據本地機器字節順序轉換。可以用格式中的第一個字符來改變對齊方式。定義如下
| Character | Byte order (字節順序大小) | Size | Alignment(對齊) |
| @(默認) | 本機(native) | 本機(native) | 本機(native),湊夠4個字節 |
| = | 本機(native) | 標準(standard) | None,按原字節數 |
| < | 小端(little-endian) | 標準(standard) | None,按原字節數 |
| > | 大端(big-endian) | 標準(standard) | None,按原字節數 |
| ! | network(= big-endian大端) | 標準(standard) | None,按原字節數 |
2.2.2、格式符
| Format格式符 | C Type(C語言類型) | Python type(Python語言類型) | Standard size |
| x | pad byte(填充字節) | no value | |
| c | Char | bytes of length 1 | 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(大寫的i) | unsigned int | integer | 4 |
| l(小寫的L) | long | integer | 4 |
| L | unsigned long | integer | 4 |
| q | long long | integer | 8 |
| Q | unsigned long long | integer | 8 |
| n | ssize_t | integer | |
| N | size_t | integer | |
| e | (6) | float | 2 |
| f | float | float | 4 |
| d | double | float | 8 |
| s | char[] | bytes | |
| p | char[] | bytes | |
| P | void* | integer |
2.3、例子
# 將浮點數變為字符串f_data1 = 123.4567f_data1 = struct.pack('<f', f_data1)u_data1 = struct.unpack('<I', f_data1)f_data2 = -123.4567f_data2 = struct.pack('<f', f_data2)u_data2 = struct.unpack('<I', f_data1)?3、二進制文件讀寫
?3.1、二進制文件寫
?????????好了,這下我們學會了如何將浮點數或者整形數據轉換為bytes了,我們現在就看如何將浮點數或者整型數據存到二進制文本中。廢話不多說,上代碼:
"""二進制文件中的浮點數存儲 """FileName = 'w2.txt'# 以二進制的形式打開一個指定文件夾,如果沒有就創建,如果有就將原來的內容覆蓋fid = open(Folder + '/' + FileName, 'wb')s2 = 123.4567s3 = -123.4567# 使用pack函數,將f數據 以小子端的方式轉換為bytesDataBytes = struct.pack('<f', s2)for i in range(4):fid.write(c_uint8(DataBytes[i])) # 在write的時候還是轉換和成c_uint8,不然會報錯DataBytes = struct.pack('<f', s3)for i in range(4):fid.write(c_uint8(DataBytes[i]))fid.close()????????最后生成了txt文件,如下所示,將顯示改成hex的方式。
3.2、二進制文件讀取? ? ? ??
????????這個時候我們并不能認為結果是對的,我們可以用matlab讀取驗證或者用Python自己讀取再將bytes數據轉換為float。
?3.2.1、Matlab讀取二進制文件
????????Matlab的代碼如下所示:
close all clear clcfid = fopen('w2.txt','r'); data1 = fread(fid,1,'float'); data2 = fread(fid,1,'float');????????我們以float的方式讀取,發現讀取的結果為123.4567和-123.4567,和我們一開始的賦值一致,證明那個我們這么寫是成功了的。
3.2.2、Python讀取二進制文件? ? ?
FileName = 'w2.txt'# 以二進制的形式打開一個指定文件夾,如果沒有就創建,如果有就將原來的內容覆蓋fid = open(Folder + '/' + FileName, 'rb')DataBytes1 = fid.read(4) # 這邊讀出來是 bytes# 將bytes解包為指定的數據類型S4 = struct.unpack('<f', DataBytes1)DataBytes1 = fid.read(4) # 這邊讀出來是 bytes# 將bytes解包為指定的數據類型S5 = struct.unpack('<f', DataBytes1)fid.close()? ??
4、寫在最后
????????好了,關于Python如何讀寫 文本文件、二進制文件、將字符串寫到txt文件中與將float或者int數據寫到txt文件的方法大概就寫到這,后面如果還遇到啥就繼續補充吧。
文中對應的代碼鏈接:
Project_File.rar-嵌入式文檔類資源-CSDN文庫https://download.csdn.net/download/yanchuan23/36135222
總結
以上是生活随笔為你收集整理的Python 学习笔记(3)对txt文件的读与写操作(下)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python 学习笔记(3)对txt文件
- 下一篇: 合成孔径雷达技术——概述