Python 文件操作:讀寫
文件操作是 Python 中用於讀取、寫入和管理磁碟文件的一組功能。無論是文本文件還是二進制文件,Python 都提供了靈活的工具來處理各類文件,讓您輕鬆應對日常開發中的數據存儲和讀取需求。
- 撰寫一個程式,創建一個 sample.txt 文件,並將一段文字寫入該文件。
- 修改程式,讓它能夠讀取 sample.txt 文件的內容並顯示在控制台上。
- 使用例外處理,處理文件不存在的情況。
2、3點會在同個function內一起處理
with
with 語法是 Python 的一種上下文管理器,它用來簡化對資源(如檔案、網絡連接或資料庫)進行處理的過程。當你使用 with 語法開啟檔案時,Python 會自動處理一些資源管理的細節,比如:
開啟檔案
操作檔案
在操作結束後自動關閉檔案
這樣的好處是,你不需要手動去呼叫 file.close() 來關閉檔案,Python 會自動幫你管理這個過程,避免漏關檔案的情況。
def write_file():with open("sample.txt", "w") as file: file.write("This a sample text 111 222")write_file() |
- open
open() 是 Python 用來開啟檔案的內建函數。這裡的 "sample.txt" 是檔案的名稱,它是要被開啟的檔案。如果檔案不存在,open() 會創建一個新檔案。
檔案開啟模式(mode),指定了檔案的讀寫方式:
"w": 以寫入模式開啟檔案。如果檔案已經存在,這個模式會覆蓋原有的檔案內容。如果檔案不存在,則會創建一個新檔案。
"wb":以二進制模式打開文件進行寫入。這是用來處理二進制數據(如圖片、音頻、或自定義格式的數據)時的模式。
"r":以讀取模式打開文件,文件必須存在。
"rb":以二進制模式讀取文件。
"a":以附加模式打開文件,寫入的數據會添加到文件末尾。
"ab":以二進制附加模式打開文件,寫入的二進制數據會被添加到文件的末尾。
- as file
as 是 Python 的一個關鍵字,用來將 open() 函數返回的檔案對象賦值給變數。在這個例子中,我們把檔案對象賦值給變數 file,這樣我們就可以用 file 來操作這個檔案。
file
file 是對應檔案的檔案對象,當你使用 with 開啟檔案後,file 就是你可以用來進行檔案讀寫的物件。在這個檔案對象上可以使用各種方法來操作檔案內容,比如:
file.write():寫入資料
file.read():讀取資料
file.writelines():寫入多行資料
file.close():關閉檔案(但是在使用 with 語法時,檔案會自動關閉,所以不需要手動關閉)
接下來是讀取檔案: try 和 except 是 Python 中用來處理例外(錯誤)的一種機制,通常稱為 異常處理。當程式碼執行過程中發生錯誤時,可以使用 try 和 except 來捕獲並處理錯誤,避免程式直接崩潰。
在這個case是,找不到指定的檔案。
def read_from_file():try: with open("sample.txt", "r") as file: content = file.read() print(content)except FileNotFoundError: print("Error! file not exist")read_from_file() |
再來,會以binary file作為檔案讀取、寫入、以及append新的資料給原始的binary file的操作示範
首先要先介紹struct模組
struct模組是 Python 的一個標準庫,提供了處理 C 語言結構體數據的功能。這個模組可以讓我們在 Python 中將數據轉換為二進制格式,或者從二進制格式中解析數據。它常用於與外部二進制文件(如 C 語言程序生成的文件)進行交互,或者處理需要高效、緊湊存儲的二進制數據。
主要功能
- 打包數據:將 Python 數據類型轉換成 C 語言結構體的二進制格式。
- 解包數據:將二進制數據轉換回 Python 類型。
- 處理二進制數據:適用於與文件系統、網絡協議或外部硬件交互的場景。
常用方法
-
struct.pack(format, v1, v2, ...)- 將多個 Python 變量根據指定的格式字符串 (
format) 轉換為二進制數據。 - 例如,將整數和浮點數打包成二進制格式。
- 將多個 Python 變量根據指定的格式字符串 (
-
struct.unpack(format, buffer)- 從二進制數據(
buffer)中解包出 Python 變量,根據指定的格式字符串 (format) 進行解包。 - 返回一個元組,元組中包含解包後的數據。
- 從二進制數據(
-
struct.calcsize(format)- 返回指定格式字符串在 C 語言結構體中所需的字節數。
格式字符串(Format String)
format 字符串告訴 struct 模組如何處理不同類型的數據。常見的格式字符如下:
| 格式字符 | 描述 | 示例 | 大小 |
|---|---|---|---|
'b' |
有符號字節(signed char) | b = -5 |
1 byte |
'B' |
無符號字節(unsigned char) | B = 255 |
1 byte |
'h' |
有符號短整數(short) | h = -32767 |
2 bytes |
'H' |
無符號短整數(unsigned short) | H = 65535 |
2 bytes |
'i' |
有符號整數(int) | i = 12345 |
4 bytes |
'I' |
無符號整數(unsigned int) | I = 4294967295 |
4 bytes |
'f' |
浮點數(float) | f = 3.14 |
4 bytes |
'd' |
雙精度浮點數(double) | d = 3.14159 |
8 bytes |
's' |
字符串(string) | s = 'hello' |
n bytes |
介紹完struct後,接下來會使用檔案寫入+strcut產生data並寫入指定檔案,用wb指定寫入模式為二進制,寫入的資料為1~10的內容,另外struct.pack('i', i),'i'指定資料為interger,後面的i則是1~10的資料,寫入file
import structdef create_binary_file_by_struct(): with open("binary_data_struct.bin", "wb") as file: # must use wb to write a binary file for i in range(1, 11): binary_data = struct.pack("i", i) # 'i' means data type which is interger file.write(binary_data)create_binary_file_by_struct() |
接下來讀取binary file,if len(data_raw) == 4,這邊是因為檔案讀到End Of File的時候,會回傳0,這時候struct.unpack("i", data_raw)[0]這個存取index 0的方式會出錯。
def read_binary_file_struct(): try: with open("binary_data_struct.bin", "rb") as file_struct: while True: data_raw = file_struct.read(4) if len(data_raw) == 4: data = struct.unpack("i", data_raw)[0] # data format is like {00 00 00 01} when we create, so just pick index 0 if not data_raw: break print(data_raw, data) except FileNotFoundError: print("File not found") read_binary_file_struct() |
再來append data,寫入11~15到檔案裡,使用方式和上面一樣,只是檔案模式使用"ab"
def append_to_binary_struct(): with open("binary_data_struct.bin", "ab") as file_struct: for i in range(11, 16): binary_data = struct.pack("i", i) file_struct.write(binary_data)append_to_binary_struct() |
另外我們也可以使用bytearray來達成類似的操作。
bytearray由下篇介紹。
