問題21:如何處理二進制文件
阿新 • • 發佈:2018-04-12
oid n) see ron idt pat HR 只讀 nbsp
一、二進制文件的結構
1、結構:頭部信息 + 數據;
頭部信息:是對這個文件是結構的介紹信息,相當於書本的目錄;
數據:文件各個結構的具體信息,相當於書本的內容;
2、打開二進制文件
例:f = open(path, ‘rb‘):以只讀形式打開指定文件;
3、讀取文件:f.read(size),讀取的文件內容為字節;如:\x10\x00\x00\x01\x02\x0D等,一個\x10代表一個字節;
4、解析讀取的字節數據:struct模塊下的unpack方法(更多參見:Python:struct模塊的pack、unpack)
#格式:struct.unpack(‘數據類型‘, f.read(size))
#數據類型:如下表,struct.unpack(‘h‘, f.read(size)),表示解析成short類型;‘i‘,表示解析成int類型;
#f.read():表示需要被解析的字節類型的數據;
#struct 類型表
Format | C Type | Python type | Standard size | Notes |
---|---|---|---|---|
x | pad byte | no value | ||
c | char | string of length 1 | 1 | |
b | signed char | integer | 1 | (3) |
B | unsigned char | integer | 1 | (3) |
? | _Bool | bool | 1 | (1) |
h |
short | integer | 2 | (3) |
H | unsigned short | integer | 2 | (3) |
i | int | integer | 4 | (3) |
I | unsigned int | integer | 4 | (3) |
l | long | integer | 4 | (3) |
L | unsigned long | integer | 4 | (3) |
q | long long | integer | 8 | (2), (3) |
Q | unsigned long long | integer | 8 | (2), (3) |
f | float | float | 4 | (4) |
d | double | float | 8 | (4) |
s | char[] | string | 1 | |
p | char[] | string | ||
P | void * | integer | (5), (3) |
import struct a = 20 b = 400 s = struct.pack(‘ii‘, a, b) print(s, type(s)) #輸出:b‘\x14\x00\x00\x00\x90\x01\x00\x00‘ <class ‘bytes‘> print(‘length: ‘, len(s)) #輸出:length: 8 s2 = struct.unpack(‘ii‘, s) print(s2) #輸出:(20, 400) s2 = struct.unpack(‘ii‘, s) #報錯:unpack requires a buffer of 4 bytes #==>解壓需要一個4字節的緩沖區,也就是說‘ii‘表示8個字節的緩沖
5、直接讀取文件數據(存放到數組內),而不是再返回一個字符串
import array f = open(‘test.wav‘) #將文件指針從首端移到末尾; f.seek(0, 2) #f.tell():返回從指針位置到文件末尾的字節數; n = f.tell()/2 #創建一個數據類型為‘h‘,長度為n的數組; buf = array.array(‘h‘, (o for _ in range(n))) #將文件指針從末尾移到首端; f.seek(2, 0) #將文件二進制數據直接讀取到buf數組內; f.readinto(buf) #查看數組內數據 print(buf[index])
問題21:如何處理二進制文件