Python 文件操作:讀寫


文件操作是 Python 中用於讀取、寫入和管理磁碟文件的一組功能。無論是文本文件還是二進制文件,Python 都提供了靈活的工具來處理各類文件,讓您輕鬆應對日常開發中的數據存儲和讀取需求。

 

  1. 撰寫一個程式,創建一個 sample.txt 文件,並將一段文字寫入該文件。
  2. 修改程式,讓它能夠讀取 sample.txt 文件的內容並顯示在控制台上。
  3. 使用例外處理,處理文件不存在的情況。

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 語法時,檔案會自動關閉,所以不需要手動關閉)

 

接下來是讀取檔案: tryexcept 是 Python 中用來處理例外(錯誤)的一種機制,通常稱為 異常處理。當程式碼執行過程中發生錯誤時,可以使用 tryexcept 來捕獲並處理錯誤,避免程式直接崩潰。

在這個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 語言程序生成的文件)進行交互,或者處理需要高效、緊湊存儲的二進制數據。

 

主要功能

  1. 打包數據:將 Python 數據類型轉換成 C 語言結構體的二進制格式。
  2. 解包數據:將二進制數據轉換回 Python 類型。
  3. 處理二進制數據:適用於與文件系統、網絡協議或外部硬件交互的場景。

常用方法

  1. struct.pack(format, v1, v2, ...)

    • 將多個 Python 變量根據指定的格式字符串 (format) 轉換為二進制數據。
    • 例如,將整數和浮點數打包成二進制格式。
  2. struct.unpack(format, buffer)

    • 從二進制數據(buffer)中解包出 Python 變量,根據指定的格式字符串 (format) 進行解包。
    • 返回一個元組,元組中包含解包後的數據。
  3. 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 struct
def 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由下篇介紹。

 

 

文章標籤
全站熱搜
創作者介紹
創作者 Luke 的頭像
Luke

Luke的部落格

Luke 發表在 痞客邦 留言(0) 人氣(15)