- 1 1. 前言
- 2 2. 使用 Python 讀取二進位檔案的方法與基本操作
- 3 3. 使用 Python 有效率地讀取二進位檔案的方法
- 4 4. 如何解析讀取到的二進位資料
- 5 5. 使用 Python 建立與寫入二進位檔案的方法
- 6 6. 使用 Python 操作實際二進位檔案的應用範例
- 7 7. 操作二進位檔案時的注意事項與最佳實踐
- 8 8. 常見問題(FAQ)
1. 前言
Python 不僅能處理文字檔案,還能讀寫二進位檔案。透過操作二進位檔案,可以處理圖像、音訊、影片、壓縮檔等各種資料格式。本文將介紹如何使用 Python 來安全且高效地讀取二進位檔案。
1.1 什麼是二進位檔案?
二進位檔案是指不是以人類可讀文字表示,而是由電腦可理解的 0 與 1 的組合所構成的檔案。常見的二進位檔案包括:
- 圖像檔案(PNG、JPEG、BMP 等)
- 音訊檔案(WAV、MP3、AAC 等)
- 影片檔案(MP4、AVI、MOV 等)
- 壓縮檔案(ZIP、RAR、GZ 等)
- 執行檔案(EXE、DLL、BIN 等)
若用一般的文字編輯器開啟二進位檔案,通常會看到亂碼。這是因為資料被以特定格式編碼,若不透過相應的程式解析,將無法正確顯示其內容。
1.2 與文字檔案的差異
二進位檔案與文字檔案的最大差異在於資料的儲存方式。
類型 | 資料內容 | 範例 |
---|---|---|
文字檔案 | 以文字編碼儲存(如 UTF-8、Shift-JIS 等) | .txt , .csv , .json |
二進位檔案 | 以 0 與 1 的位元組儲存 | .jpg , .mp3 , .exe |
主要差異
- 資料結構
- 文字檔案只包含可解讀的字元資料。
- 二進位檔案可包含各種資料(如圖像、音訊、可執行程式碼等)。
- 檔案大小
- 文字檔案在儲存少量資料時檔案較小。
- 二進位檔案可能因編碼方式而產生較大的檔案。
- 編輯方式
- 文字檔案可直接用
Notepad
或VS Code
編輯。 - 二進位檔案需透過專用軟體(如二進位編輯器)才能編輯。
1.3 為什麼要用 Python 處理二進位檔案
使用 Python 操作二進位檔案的原因如下:
① 處理圖像與音訊資料
讀取二進位檔案後,可使用 Python 分析圖像或處理音訊資料。
# 範例:讀取 PNG 圖像檔案的二進位資料
with open("image.png", "rb") as file:
binary_data = file.read()
print(binary_data[:20]) # 顯示前 20 位元組
② 分析壓縮資料
Python 提供 zipfile
與 gzip
等模組,可透過程式解壓縮 ZIP 與 GZ 檔案。
import gzip
# 範例:開啟 GZ 壓縮檔
with gzip.open("example.gz", "rb") as file:
content = file.read()
print(content)
③ 分析二進位協議資料
在網路通訊或資料庫底層操作中,經常需要解析二進位資料。透過 struct
模組,可以將二進位轉換為數字或文字。
import struct
# 範例:將二進位資料轉換成整數
binary_data = b' ' # 4 位元組資料
integer_value = struct.unpack('<I', binary_data)[0]
print(integer_value) # 輸出:1
1.4 小結
- 二進位檔案 是用來儲存圖像、音訊、壓縮資料等的格式。
- 不同於文字檔案,資料是以 0 與 1 的位元組形式儲存。
- Python 可用來解析、處理與轉換這些二進位資料。
- 透過 Python 的
open()
函式與struct
模組,可有效處理二進位檔案。
2. 使用 Python 讀取二進位檔案的方法與基本操作
在 Python 中,可以使用 open()
函式來開啟與讀取二進位檔案。本章將說明如何在 Python 中進行基本的二進位檔案操作。
2.1 使用 open()
函式讀取二進位檔案
Python 的 open()
是開啟檔案的基本函式。若要開啟二進位檔案,需指定 'rb'
(唯讀二進位模式)。
基本語法
file = open("example.bin", "rb") # 'rb' 表示以二進位模式讀取
binary_data = file.read() # 讀取檔案內容
file.close() # 關閉檔案
但使用此方法時,如果未手動呼叫 close()
,可能導致資源未釋放的問題。因此建議使用 with
語句來確保安全地關閉檔案。
2.2 使用 with
語句安全讀取二進位檔案
透過 with
語句,可以自動管理檔案開關,即使發生錯誤也能自動釋放資源。
範例:安全讀取二進位資料
with open("example.bin", "rb") as file:
binary_data = file.read()
# 離開 with 區塊後,file 將自動關閉
使用 with
的優點
- 不需要手動呼叫
file.close()
,會自動關閉 - 即使發生錯誤也不會造成資源洩漏
- 程式碼簡潔,提升可讀性
2.3 不同的讀取方式
Python 提供多種方式來讀取二進位檔案,可根據用途選擇合適的方法。
① 一次讀取所有資料(read()
)
將整個檔案的資料一次性載入記憶體的方式。
with open("example.bin", "rb") as file:
binary_data = file.read() # 一次讀取全部資料
優點
- 簡單直觀
- 適合小型檔案
缺點
- 對大型檔案會佔用大量記憶體
② 分段讀取指定位元組數(read(n)
)
將檔案分段讀取,適合處理大型檔案。
with open("example.bin", "rb") as file:
chunk = file.read(1024) # 每次讀取 1024 位元組(1KB)
while chunk:
print(chunk) # 處理讀取到的資料
chunk = file.read(1024)
優點
- 降低記憶體使用量
- 適合大型檔案的處理
缺點
- 不適用於需要一次性處理整個檔案的情境
③ 逐行讀取二進位資料(readline()
)
若二進位資料中包含換行符號(`\n`),可以逐行讀取。
with open("example.bin", "rb") as file:
line = file.readline()
while line:
print(line)
line = file.readline()
適用情境
- 包含換行符號的二進位記錄檔(如二進位格式的日誌檔)
注意事項
- 若資料中無換行符號,會視為一整行,僅適用於特定格式的檔案
2.4 使用 seek()
操作檔案位置
seek()
可用來從指定位置開始讀取資料。
seek()
的基本語法
file.seek(offset, whence)
參數 | 說明 |
---|---|
offset | 位移的位元組數 |
whence | 參考點(0 : 檔案開頭, 1 : 目前位置, 2 : 檔案末尾) |
範例:從特定位置讀取資料
with open("example.bin", "rb") as file:
file.seek(10) # 從檔案開頭偏移 10 位元組
data = file.read(5) # 讀取 5 位元組
print(data)
用途
- 讀取檔案的標頭資訊
- 分析資料的特定區段
2.5 使用 tell()
取得目前檔案位置
tell()
可取得目前讀取的位元組位置。
範例:取得當前位置
with open("example.bin", "rb") as file:
file.read(10) # 讀取前 10 位元組
position = file.tell() # 取得目前位置
print(f"目前檔案位置:{position} 位元組")
用途
- 確認目前已讀取的位置
- 進行中斷點處理或除錯時使用
2.6 小結
- 使用 Python 開啟二進位檔案時,應使用
'rb'
模式 - 建議使用
with
語句來安全關閉檔案 - 若檔案較大,應使用
read(n)
分段讀取以節省記憶體 seek()
可移動讀取位置,tell()
可取得當前位置
3. 使用 Python 有效率地讀取二進位檔案的方法
在前一章中,我們介紹了如何以基本方式開啟二進位檔案。本章將深入說明如何更有效率地讀取二進位檔案。Python 提供多種方式來處理二進位資料,選擇合適的方式有助於提升效能與穩定性。
3.1 一次性讀取整個二進位檔案(read()
)
可使用 read()
方法一次性將整個二進位檔案讀入記憶體中。
基本語法
with open("example.bin", "rb") as file:
binary_data = file.read()
優點
- 簡單且直觀
- 適合檔案較小(例如數 MB 以下)的情況
缺點
- 檔案過大時(數百 MB 以上)會佔用大量記憶體
- 可能因記憶體不足導致程式當掉
實際範例
with open("sample.bin", "rb") as file:
binary_data = file.read()
print(len(binary_data)) # 顯示檔案大小(位元組數)
此方法適合用於檔案較小(如幾 MB 以內)的情境。
3.2 分段讀取指定位元組數(read(n)
)
在處理大型檔案時,建議使用 分段讀取 的方式來降低記憶體消耗。
基本語法
with open("example.bin", "rb") as file:
chunk = file.read(1024) # 每次讀取 1024 位元組(1KB)
while chunk:
print(chunk)
chunk = file.read(1024)
優點
- 能有效減少記憶體負擔
- 適合串流處理(streaming)
缺點
- 若需一次性處理整個檔案,需額外邏輯整合
實際範例
with open("large_file.bin", "rb") as file:
while True:
chunk = file.read(4096) # 每次讀取 4KB
if not chunk:
break
print(f"已讀取 {len(chunk)} 位元組")
此方法適用於GB 級別的大型檔案,能有效避免記憶體溢位。
3.3 逐行讀取二進位資料(readline()
)
若二進位檔案中包含換行符號(如二進位格式的日誌檔),可使用 readline()
逐行處理。
基本語法
with open("example.bin", "rb") as file:
line = file.readline()
while line:
print(line)
line = file.readline()
適用情境
- 含換行的二進位日誌或通訊資料
注意事項
- 若檔案中無換行符號,將整個視為一行
- 一般的二進位資料不建議使用此方法
3.4 從特定位置讀取資料(活用 seek()
)
若只需處理檔案中的特定區塊,可使用 seek()
來指定讀取起點。
基本語法
file.seek(offset, whence)
參數 | 說明 |
---|---|
offset | 位移的位元組數 |
whence | 起點(0 : 檔案開頭, 1 : 目前位置, 2 : 檔案結尾) |
實例:從特定位置開始讀取
with open("example.bin", "rb") as file:
file.seek(10) # 移動到第 10 位元組
data = file.read(5) # 讀取 5 位元組
print(data)
此方法適合用於解析檔案標頭或擷取特定資料區段。
3.5 取得目前的檔案位置(tell()
)
tell()
可用來檢查目前的讀取位置(位元組數)。
實例
with open("example.bin", "rb") as file:
file.read(20) # 讀取 20 位元組
position = file.tell()
print(f"目前的位置:{position} 位元組")
用途
- 確認讀取進度
- 進行中斷點記錄或除錯分析
3.6 使用記憶體對映(mmap
)加速讀取
透過 mmap
模組,可將檔案映射至虛擬記憶體中,提高讀取速度。
基本語法
import mmap
with open("example.bin", "rb") as file:
with mmap.mmap(file.fileno(), 0, access=mmap.ACCESS_READ) as mmapped_file:
print(mmapped_file[:100]) # 讀取前 100 位元組
優點
- 能像操作記憶體一樣處理整個檔案
- 可快速存取任意位置
缺點
- 較複雜,初學者需特別注意
- 若映射過大的檔案,可能導致記憶體不足
3.7 小結
- 根據檔案大小與用途選擇適當的讀取方式
- 小檔案:使用
read()
一次讀入 - 大檔案:使用
read(n)
分段處理 - 需定位讀取時使用
seek()
,追蹤位置用tell()
- 需高效處理時可使用
mmap
進行記憶體對映
4. 如何解析讀取到的二進位資料
使用 Python 讀取二進位檔案之後,接下來的重要步驟就是正確解析這些資料。二進位資料通常以整數、字串、浮點數等格式儲存,因此理解資料結構並選擇合適的解析方法相當關鍵。
本章將介紹如何使用 Python 的 struct
模組來解析二進位資料。
4.1 什麼是 struct
模組?
Python 的 struct
模組是標準函式庫之一,提供了以指定格式將二進位資料轉換為 Python 變數(解碼 / unpack)或反向操作(編碼 / pack)的功能。
主要功能
- 將二進位資料轉換成整數、浮點數、字串(解包 / unpack)
- 將變數轉換成二進位格式(打包 / pack)
- 可指定位元組順序(Endian / Byte Order)
struct
模組的基本語法
import struct
# 將二進位資料解碼為指定格式
data = struct.unpack(format, binary_data)
# 將變數打包為二進位資料
binary_data = struct.pack(format, value1, value2, ...)
4.2 解碼(Unpack)二進位資料
從檔案中讀取的二進位資料,可以透過 struct.unpack()
解碼為可讀的數值或文字。
範例:解析 4 位元組整數(32 位)
import struct
# 4 位元組的二進位資料
binary_data = b'\x01\x00\x00\x00' # 表示整數 1(小端格式)
# 解碼為 32 位無號整數(小端格式)
value = struct.unpack('
格式符號 | 資料型別 | 位元組數 |
---|---|---|
b | 有號 8 位元整數(char) | 1 |
B | 無號 8 位元整數(uchar) | 1 |
h | 有號 16 位元整數(short) | 2 |
H | 無號 16 位元整數(ushort) | 2 |
i | 有號 32 位元整數(int) | 4 |
I | 無號 32 位元整數(uint) | 4 |
f | 浮點數(float) | 4 |
d | 雙精度浮點數(double) | 8 |
4.3 解析字串資料
若二進位資料中包含文字,可用 struct.unpack()
解析後再進行字串解碼。
範例:解碼 10 位元組字串
import struct
binary_data = b'HelloWorld'
decoded_string = struct.unpack('10s', binary_data)[0].decode('utf-8')
print(decoded_string) # 輸出:HelloWorld
注意事項
- 使用
'10s'
表示固定長度的 10 位元組字串。 - 解碼時使用
.decode('utf-8')
轉為可讀的字串。
4.4 解析浮點數
若資料為 IEEE 754 格式的浮點數,也可使用 struct
解碼。
範例:解碼 4 位元組浮點數
import struct
binary_data = b'\x00\x00\x80?'
value = struct.unpack('
4.5 指定位元組順序(Endian)
位元組順序(Endian)會影響二進位資料的解讀結果,主要有兩種:
Endian | 說明 |
---|---|
Little Endian(小端) | 低位元組在前(常見於 Intel CPU) |
Big Endian(大端) | 高位元組在前(常見於網路協定) |
範例:比較小端與大端解碼結果
import struct
binary_data = b'\x01\x00\x00\x00'
# 小端解碼
little = struct.unpack('I', binary_data)[0]
print(f"Big Endian: {big}") # 輸出:16777216
4.6 小結
- 使用 Python 的
struct
模組可將二進位資料轉為整數、浮點數、字串等型別 - 解析時需確認資料格式與長度是否正確
- 位元組順序(Endian)會影響資料解讀結果,需正確指定
- 可結合多種格式一次解析複合結構的資料(如檔案標頭)
5. 使用 Python 建立與寫入二進位檔案的方法
在上一章中,我們說明了如何解析二進位資料。本章將介紹如何使用 Python 建立新的二進位資料並寫入檔案中,讓你不只能讀取,也能輸出二進位格式的資料。
5.1 以二進位模式寫入檔案
要建立新的二進位檔案,可使用 open()
函式搭配 'wb'
模式(write binary)。
基本語法
with open("example.bin", "wb") as file:
file.write(binary_data)
'wb'
表示以二進位模式進行寫入。- 使用
write()
方法將位元組資料寫入檔案。
簡單範例:寫入二進位資料
with open("output.bin", "wb") as file:
file.write(b'\xDE\xAD\xBE\xEF') # 寫入 4 個位元組
重點說明
b''
表示位元組資料,可使用 16 進位表示每個位元組。- 實際檔案大小為 4 位元組。
5.2 使用 struct.pack()
建立二進位資料
struct.unpack()
是解碼資料,而相反地,struct.pack()
可將數值轉換成二進位資料,方便寫入檔案。
基本語法
import struct
binary_data = struct.pack(format, value1, value2, ...)
format
為格式字串,指定資料型別與位元組順序。value1, value2, ...
為要打包的值。
5.3 寫入數值資料到二進位檔案
將整數或浮點數儲存為二進位資料時,可先 使用 pack()
打包後再寫入。
範例:將整數打包為二進位並寫入
import struct
# 打包為:無號 16 位元 + 無號 32 位元(小端格式)
binary_data = struct.pack('
說明
'
:代表小端格式的 2 + 4 位元組。512
會被轉為 16 進位0x0200
,123456789
會轉為0x075BCD15
。
5.4 寫入字串資料到二進位檔案
可以將固定長度的字串資料轉為二進位並儲存。
範例:寫入 10 位元組的字串
import struct
text = "Hello"
binary_data = struct.pack('10s', text.encode('utf-8'))
with open("text.bin", "wb") as file:
file.write(binary_data)
重點說明
'10s'
表示固定長度 10 的位元組字串。- 使用
encode('utf-8')
轉換成位元組資料。 - 若實際字串少於 10 字元,會以
\x00
補滿。
5.5 寫入浮點數資料
浮點數也可使用 struct.pack()
轉為二進位格式後寫入。
範例:寫入浮點數資料
import struct
float_value = 3.14
binary_data = struct.pack('
說明
'
表示小端格式的 4 位元浮點數。 - 3.14 對應的 IEEE 754 格式為
0xC3F54840
(以位元表示)。
5.6 追加寫入二進位資料('ab'
模式)
若想在不刪除原檔內容的情況下新增資料,可使用 'ab'
模式。
範例:追加寫入資料到檔案末尾
with open("output.bin", "ab") as file:
file.write(b'\xFF\xFF') # 追加 2 個位元組
說明
'ab'
代表以二進位方式附加寫入。- 不會覆蓋原有檔案內容,直接在尾端追加資料。
5.7 使用 seek()
寫入特定位置
也可以移動游標位置後寫入資料,例如修改檔案中段落。
範例:從檔案第 10 位元組開始寫入
with open("output.bin", "r+b") as file:
file.seek(10) # 移動到第 10 位元組
file.write(b'\xAA\xBB') # 寫入 2 位元組資料
說明
'r+b'
模式允許讀取與寫入二進位檔案。seek(10)
會將寫入位置移動到檔案第 10 位元組。
5.8 小結
- 使用
'wb'
模式可建立並寫入新的二進位檔案 - 使用
struct.pack()
可將數值、字串等轉為二進位格式 'ab'
模式可在不覆蓋原資料的情況下追加寫入- 使用
seek()
可控制寫入位置,方便局部修改
6. 使用 Python 操作實際二進位檔案的應用範例
在前面的章節中,我們已學習如何使用 Python 讀取與寫入二進位檔案。本章將提供幾個實際範例,包括圖片、音訊以及自訂格式的二進位資料解析,幫助你將理論應用於實際情境。
6.1 解析 PNG 圖片的二進位資料
什麼是 PNG 檔案?
PNG(Portable Network Graphics)是一種無損壓縮圖像格式,其檔案內容由標頭資訊與影像資料組成的二進位資料構成。
PNG 檔案的標頭結構
每個 PNG 檔案的開頭 8 個位元組是固定的魔術數值,用來識別該檔案為 PNG 格式:
89 50 4E 47 0D 0A 1A 0A
解析 PNG 的二進位資料
with open("example.png", "rb") as file:
header = file.read(8) # 讀取前 8 個位元組
print("PNG 標頭:", header)
輸出範例
PNG 標頭: b'\x89PNG\r\n\x1a\n'
若出現此魔術數值,即可確認檔案為有效的 PNG 格式。
6.2 解析 WAV 音訊檔案
什麼是 WAV 檔案?
WAV(Waveform Audio File Format)是未壓縮的音訊檔案格式,檔案前方包含聲道數、取樣率、位元深度等資訊,儲存在標頭中。
WAV 檔案的標頭解析
WAV 檔案遵循 RIFF 格式,其前 44 個位元組包含基本音訊資訊。
解析 WAV 的二進位標頭
import struct
with open("example.wav", "rb") as file:
header = file.read(44) # 讀取標頭(44 位元組)
# 解析 RIFF 區段
riff, size, wave = struct.unpack('<4sI4s', header[:12])
# 解析格式區段
fmt, fmt_size, audio_format, num_channels, sample_rate = struct.unpack('<4sIHHI', header[12:24])
print(f"RIFF 標頭: {riff}")
print(f"格式: {wave}")
print(f"音訊格式: {audio_format}")
print(f"聲道數: {num_channels}")
print(f"取樣率: {sample_rate} Hz")
輸出範例
RIFF 標頭: b'RIFF'
格式: b'WAVE'
音訊格式: 1
聲道數: 2
取樣率: 44100 Hz
- RIFF → 表示為 WAV 音訊檔
- Channels: 2 → 立體聲
- Sample Rate: 44100 → CD 音質
6.3 解析自訂格式的二進位檔案
有些應用場景會使用自訂的二進位資料結構,以下是一個簡化的範例來說明如何使用 struct
解碼這些資料。
資料格式設計
位元組範圍 | 資料型別 | 用途 |
---|---|---|
0–3 | I (4 位元整數) | 檔案 ID |
4–7 | f (4 位元浮點數) | 版本號 |
8–17 | 10s (10 位元組字串) | 名稱 |
解析範例
import struct
with open("custom_data.bin", "rb") as file:
data = file.read()
file_id, version, name = struct.unpack('
輸出範例
檔案 ID: 12345
版本: 1.2
名稱: TestFile
6.4 小結
- 解析 PNG 圖片時,可透過魔術數值確認檔案類型
- WAV 音訊可從標頭讀取聲道數與取樣率
- 自訂格式的二進位檔案,也可利用
struct.unpack()
解碼 - 正確理解資料結構後,Python 能夠靈活處理各種二進位檔案
7. 操作二進位檔案時的注意事項與最佳實踐
在使用 Python 處理二進位檔案時,為了避免資料毀損、提升效能與確保程式穩定性,我們需要留意一些關鍵原則。本章將介紹操作二進位資料時應遵守的注意事項與最佳實務。
7.1 最佳化處理大型檔案
二進位檔案經常為大型檔案,例如數百 MB 到數 GB 不等。若一次性讀入整個檔案,會導致記憶體耗盡或程式當機。
錯誤示範:一次性載入整個大型檔案
with open("large_file.bin", "rb") as file:
data = file.read() # 危險!全部載入記憶體
問題點
- 記憶體使用量過大
- 可能導致系統資源耗盡
建議做法:分段讀取資料
with open("large_file.bin", "rb") as file:
while chunk := file.read(4096): # 每次讀取 4KB
process(chunk) # 處理資料
優點
- 控制記憶體使用量
- 穩定處理大型檔案
7.2 使用 with
語法確保自動關閉檔案
若未正確關閉檔案,可能會導致資源洩漏,特別是在長時間執行或大量檔案操作的情境中。
錯誤示範
file = open("example.bin", "rb")
data = file.read()
# 忘記呼叫 close(),導致資源未釋放
正確做法:使用 with
with open("example.bin", "rb") as file:
data = file.read()
# 離開區塊時,自動關閉檔案
優點
- 可讀性佳
- 即使發生錯誤,也能正確釋放資源
7.3 注意位元組順序(Endian)
在跨平台或處理網路通訊時,需特別注意資料的位元組順序(Endian)。
Endian 類型 | 說明 |
---|---|
Little Endian | 低位元組在前(如 Intel CPU) |
Big Endian | 高位元組在前(如網路協定) |
範例:解碼時指定 Endian
import struct
binary_data = b'\x01\x00\x00\x00'
little = struct.unpack('I', binary_data)[0]
print("Big Endian:", big) # 輸出:16777216
7.4 加入例外處理避免錯誤中斷
操作檔案時,常見錯誤包含檔案不存在、權限不足、格式錯誤等,建議加入 try-except
來避免程式崩潰。
錯誤類型 | 原因 |
---|---|
FileNotFoundError | 檔案不存在 |
PermissionError | 無讀寫權限 |
struct.error | 格式與資料長度不符 |
範例:安全地處理檔案
import struct
try:
with open("example.bin", "rb") as file:
data = file.read(4)
value = struct.unpack('
7.5 二進位資料的除錯方式
若想檢視二進位內容,可使用 binascii.hexlify()
或 Linux/macOS 的 hexdump
工具。
在 Python 中用 16 進位查看資料
import binascii
with open("example.bin", "rb") as file:
data = file.read(16)
print(binascii.hexlify(data))
在終端機中使用 hexdump(Linux/macOS)
hexdump -C example.bin | head
輸出範例
00000000 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 |.PNG......IHDR|
7.6 小結
- 處理大型二進位檔案時應使用分段讀取
- 永遠使用
with
語法以確保檔案被正確關閉 - 務必確認 Endian,避免資料解析錯誤
- 加入例外處理以提升程式穩定性
- 善用
binascii
或hexdump
來除錯二進位資料
8. 常見問題(FAQ)
以下彙整了使用 Python 操作二進位檔案時,常被詢問的問題與解決方法。這些問答將幫助你更深入理解 Python 處理二進位資料的關鍵觀念與實務技巧。
Q1:文字檔案與二進位檔案有什麼不同?
項目 | 文字檔案 | 二進位檔案 |
---|---|---|
資料儲存格式 | 使用文字編碼(UTF-8、Big5 等) | 0 和 1 的位元組序列 |
副檔名範例 | .txt 、.csv 、.json | .jpg 、.mp3 、.bin |
編輯方式 | 可用記事本或編輯器直接編輯 | 需使用十六進位或專用編輯器 |
用途 | 設定檔、原始碼、純文字內容 | 圖片、音樂、影片、執行檔 |
Q2:'rb'
與 'r'
模式差在哪?
模式 | 說明 |
---|---|
'r' | 文字模式,自動處理換行符號 |
'rb' | 二進位模式,以原始位元組方式讀取 |
Q3:struct
模組到底怎麼用?
struct
模組可將 Python 數值或字串轉為二進位格式(pack),也可將二進位資料還原成變數(unpack)。
範例:將 4 位元組資料解碼為整數
import struct
binary_data = b'\x01\x00\x00\x00'
value = struct.unpack('
Q4:如何將二進位資料轉換為可讀格式?
可使用 binascii.hexlify()
將二進位轉為十六進位字串以方便閱讀。
範例:轉為十六進位表示
import binascii
with open("example.bin", "rb") as file:
binary = file.read()
hex_string = binascii.hexlify(binary)
print(hex_string)
Q5:什麼是 Endian(位元組順序)?
Endian 表示數值儲存時位元組的排列順序。
類型 | 說明 |
---|---|
Little Endian | 低位在前(如 Intel 架構) |
Big Endian | 高位在前(如網路傳輸格式) |
Q6:處理大型二進位檔案時,該怎麼做才有效率?
建議使用「分段讀取」方式,例如每次讀取 4KB:
with open("large_file.bin", "rb") as file:
while chunk := file.read(4096):
process(chunk)
Q7:要如何除錯二進位資料?
可用 Python 的 binascii
模組,或在命令列使用 hexdump
。
Python 範例
import binascii
with open("example.bin", "rb") as file:
data = file.read(16)
print(binascii.hexlify(data))
命令列(Linux/macOS)
hexdump -C example.bin | head
總結
- 開啟二進位檔案時請使用
'rb'
模式 - 可透過
struct
解析或建立二進位格式資料 - Endian(大小端)不同會影響解讀結果,必須注意
- 大型檔案應使用分段讀取以節省記憶體
- 可用
binascii
或hexdump
協助除錯
最後補充
讀完本指南後,你已掌握使用 Python 操作二進位檔案的全方位技巧。未來可將這些知識應用在實際的資料處理、影像解析、通訊協定等場景中,成為處理低階資料的專業開發者!🚀