原文地址: https://blog.csdn.net/and_then111/article/details/86744938
原文地址: https://www.cnblogs.com/hxvicky/p/4645303.html
1. 什么是.bin文件
擴展名為.bin的文件就是一個二進制文件(binary)。不同於文本文件,二進制文件用記事本、Notepad++等打開都是亂碼。
像是這樣:
但是.bin文件可以用WINHEX等軟件打開。二進制文件里面存儲的都是數據,只有按照某個預先設定的規則讀出,才能明白這些數字的具體含義。
WINHEX將二進制文件內容轉為十六進制的形式展現出來:
二進制文件相比於文本文件的優點:節約存儲空間、讀寫速度快、有一定的加密保護作用。
關於二進制文件與文本文件,可以參考下這個博客程序員別唬我系列之:二進制文件
2. 二進制文件讀寫
2.1 讀二進制文件
讀二進制文件 “x.bin” 的內容,每次輸出一個字節。
(1) 文件路徑放在filepath
中,這里將.bin文件與代碼文件放在了同一個文件夾下,因此沒有寫絕對路徑。
(2) open(filepath, 'rb')
:以讀的形式打開文件文件,注意使用 rb 來讀二進制文件。
(3) 記得close: binfile.close()
import struct
import os
if __name__ == '__main__':
filepath='x.bin'
binfile = open(filepath, 'rb') #打開二進制文件
size = os.path.getsize(filepath) #獲得文件大小
for i in range(size):
data = binfile.read(1) #每次輸出一個字節
print(data)
binfile.close()
運行,輸出結果:
如果想看到十進制的結果,可以使用python中的struct.unpack()方法:
struct.unpack('B', data)
:這里的參數B
的含義是將C結構數據的unsigned char 類型轉為python中的integer
這里得到的num是tuple類型,因此使用num[0]
將數字取出。
for i in range(size):
data = binfile.read(1)
num = struct.unpack('B', data)
print(num[0])
輸出結果為:
2.2 寫二進制文件
(1) 假設要把數字123寫入二進制文件,首先需要把數字int類型轉為bytes類型。
data.to_bytes(1, 'big')
:參數 ‘1
’ :轉為1個字節的bytes; 參數 'big
’ :byteorder。
查看某個變量
a
的類型,可以利用type()
a=123
print('a:',type(a))
b=a.to_bytes(1,'big')
print('b:',type(b))
輸出:
(2) open(filepath, 'ab+')
:寫模式打開二進制文件。
寫入時注意:使用 ab+ 來完成追加寫入,使用 wb來完成覆蓋寫入。
(3) 關閉binfile.close()
data=123
content= data.to_bytes(1, 'big')
filepath='123.bin'
binfile = open(filepath, 'ab+') #追加寫入
binfile.write(content)
print('content',content)
binfile.close()
2.3 打開文件模式
列了下打開文件的不同模式,也就是open()
里第二個參數。 帶b的參數表示操作二進制文件,不帶b的操作文本文件。
摘自Python文件讀寫(open(),close(),with open() as f…
模式 | 描述 |
---|---|
r | 以只讀方式打開文件。文件的指針將會放在文件的開頭。這是默認模式。 |
rb | 以二進制格式打開一個文件用於只讀。文件指針將會放在文件的開頭。這是默認模式。 |
r+ | 打開一個文件用於讀寫。文件指針將會放在文件的開頭。 |
rb+ | 以二進制格式打開一個文件用於讀寫。文件指針將會放在文件的開頭。 |
w | 打開一個文件只用於寫入。如果該文件已存在則將其覆蓋。如果該文件不存在,創建新文件。 |
wb | 以二進制格式打開一個文件只用於寫入。如果該文件已存在則將其覆蓋。如果該文件不存在,創建新文件。 |
w+ | 打開一個文件用於讀寫。如果該文件已存在則將其覆蓋。如果該文件不存在,創建新文件。 |
wb+ | 以二進制格式打開一個文件用於讀寫。如果該文件已存在則將其覆蓋。如果該文件不存在,創建新文件。 |
a | 打開一個文件用於追加。如果該文件已存在,文件指針將會放在文件的結尾。也就是說,新的內容將會被寫入到已有內容之后。如果該文件不存在,創建新文件進行寫入。 |
ab | 以二進制格式打開一個文件用於追加。如果該文件已存在,文件指針將會放在文件的結尾。也就是說,新的內容將會被寫入到已有內容之后。如果該文件不存在,創建新文件進行寫入。 |
a+ | 打開一個文件用於讀寫。如果該文件已存在,文件指針將會放在文件的結尾。文件打開時會是追加模式。如果該文件不存在,創建新文件用於讀寫。 |
ab+ | 以二進制格式打開一個文件用於追加。如果該文件已存在,文件指針將會放在文件的結尾。如果該文件不存在,創建新文件用於讀寫。 |
numpy 保存數據
以3*4數組a為例:
方法1:
a.tofile("filename.bin")
這種方法只能保存為二進制文件,且不能保存當前數據的行列信息,文件后綴不一定非要是bin,也可以為txt,但不影響保存格式,都是二進制。
這種保存方法對數據讀取有要求,需要手動指定讀出來的數據的的dtype,如果指定的格式與保存時的不一致,則讀出來的就是錯誤的數據。
b = numpy.fromfile("filename.bin",dtype = **)
讀出來的數據是一維數組,需要利用
b.shape = 3,4
重新指定維數。
方法2.
numpy.save("filename.npy",a)
利用這種方法,保存文件的后綴名字一定會被置為.npy,這種格式最好只用
numpy.load("filename")
來讀取。
方法3.
numpy.savetxt("filename.txt",a)
b = numpy.loadtxt("filename.txt")
用於處理一維和二維數組