Python 檔案處理是程式設計中一個非常重要的環節,無論你是想:
功能 | 解釋 | 範例 |
---|---|---|
開啟檔案open("filename.txt", "mode") |
開啟檔案 filename.txt 。常見模式有:r 讀取、w 覆寫、a 追加、x 創建新檔案、b 二進位模式。 |
file = open("filename.txt", "r") |
讀取整個檔案 .read() |
讀取檔案所有內容,返回為字串。 | words = file.read() |
讀取指定數量的字元 .read(n) |
讀取指定字元數量 n ,返回為字串。 |
word = file.read(6) |
讀取單行 .readline() |
讀取下一行內容,返回為字串。 | first_line = file.readline() |
讀取所有行 .readlines() |
讀取所有行並返回列表,每行作為列表的一個元素。佔記憶體 | lines = file.readlines() |
寫入檔案 .write(str) |
將字串 str 寫入檔案(覆蓋模式)。 |
file.write("Hello, world!\n") |
寫入多行 .writelines(seq) |
將 seq 序列中的每個元素作為一行寫入檔案,適用於列表或元組 |
lines = ["Line 1\n", "Line 2\n"] file.writelines(lines) |
使用 print() 寫入 print(data, file=file) |
使用 print() 函數將 data 寫入到指定的檔案 file 。 |
data = "Hello, world!" print(data, file=file) |
使用 with 自動關閉with open("filename.txt", "mode") as file |
使用 with 開啟檔案,程式執行完畢後會自動關閉檔案。 |
with open("filename.txt", "w") as file: file.write("Hello, world!") |
with 和 writelines() |
with open("my_file.txt", "w") as file file.writelines(lines) |
利用 with 配合 writelines() 一次寫入多行,避免忘記關閉檔案。 |
print() 導向檔案 |
print(data, file=f) |
將 print() 函數的輸出導向指定的檔案 f 。 |
open()
基本語法
file = open("filename.txt", "mode")
file.close()
filename.txt: 要開啟的檔案名稱相對路徑。
mode: 開啟模式,常見的有:
r: 讀取 (預設)
w: 寫入 (覆寫)
a: 追加 (在檔案末尾追加)
x: 創建新檔案 (如果檔案已存在則報錯)
with
一起使用 開啟檔案什麼是 with 陳述式?
with 陳述式是一種上下文管理器,它讓程式碼更簡潔,並且能自動釋放資源。
為什麼要用 with 陳述式?
在處理檔案、資料庫連接等資源時,為了避免忘記關閉檔案導致的資源洩露,使用 with 陳述式能確保資源在使用完畢後被自動正確關閉檔案,即使發生異常。
with 陳述式的語法
with open(expression,"mode") as variable:
# 在這個區塊中,可以使用 variable 來訪問資源
- expression:通常是一個函式呼叫,返回一個上下文管理器物件。
- variable:一個變數,用來表示上下文管理器所管理的資源。
with open("my_file.txt", "a" as file:
file.write("This is a new line.\n")
as file 中的 file 是自定義的
as file 中的 file 並不是 Python 的關鍵字,而是一個變量名稱。
你可以將它換成任何你喜歡的變量名稱
"r"
假設我有一份my_file.txt 裡面內容為:
I love python
I love Club
with open("my_file.txt","r") as file:
words = file.read()
print(words)
#輸出
I love python
I love Club
with open("my_file.txt","r") as file:
word = file.read(6)
print(word)
file.close()
#輸出 I love
with open("my_file.txt","r") as file:
first_line = file.readline()
second_line = file.readline()
print(second_line,first_line,sep='\n')
#輸出
I love Club
I love python
它會將文件中的每一行讀取為一個元素,並將這些元素存儲在一個列表中。
with open("my_file.txt","r") as file:
a = file.readlines()
print(a)
#輸出
['I love python\n',
'I love Club']
# 遍歷每一行
with open("my_file.txt","r") as file:
for line in file.readlines():
print(line)
#輸出
I love python
I love Club
編碼是將文字轉換成電腦可以理解的二進位數字的過程。不同的編碼方式使用不同的對應關係,例如 ASCII、UTF-8、Big5 等。
在讀取或開啟文件時,python會根據你電腦的os預設encoding來呈現,
但如果跟其他人寫入文件的encoding不同,就 有可能會看到亂碼 。
所以在處理文字檔案時,必須指定正確的編碼方式,才能正確地讀取和寫入資料。
with open('my_file.txt', 'r', encoding='utf-8') as f:
for line in f:
print(line, end='')
'w': 寫入模式,如果檔案存在則會覆蓋原有檔案內容。如果檔案不存在,則會創建新檔案。
'a': 附加模式,用於在檔案末尾追加內容。如果檔案不存在,則會創建新檔案。
'x': 排他性創建模式,如果檔案已經存在則會報錯。
'b': 二進位模式,用於讀寫二進位資料。
't': 文字模式(預設),用於讀寫文字資料。
'w'
模式寫入檔案的步驟先打開檔案寫入,再讀取(分開操作,無法同時寫入和讀取)
原因: 在同一個 with 語句中,使用 'w' 模式開啟檔案後,檔案就處於寫入狀態。如果你想在寫入之後立即讀取,需要重新開啟檔案,並使用 'r' 模式。
# 以寫入模式開啟一個名為 my_file.txt 的檔案
with open('my_file.txt', 'w', encoding='utf-8') as f:
#寫入檔案
file.write("Hello, world!\n") # 寫入一行文字
#再讀取
with open('my_file.txt', 'r', encoding='utf-8') as f:
for line in f:
print(line, end='')
這段程式碼做了以下事情:
- 開啟檔案: 使用 with open() 開啟名為 my_file.txt 的檔案,以讀取模式開啟,並指定編碼為 UTF-8。
- 逐行讀取: 使用 for 迴圈逐行讀取檔案內容,並將每一行印出。
- 自動關閉: 離開 with 區塊時,檔案會自動關閉。
'a'
模式來追加寫入並讀取(同一個檔案)# 寫入檔案
with open('my_file.txt', 'a', encoding='utf-8') as f:
f.write("Hello, world!\n")
# 讀取檔案
with open('my_file.txt', 'r', encoding='utf-8') as f:
for line in f:
print(line, end='')
'x'
模式'x' 模式 的主要用途是 創建一個新檔案,如果檔案已經存在,就會報錯。因此,它並不能直接用於追加寫入和讀取同一個檔案。
with open('my_file.txt', 'x') as f:
f.write("第一次寫入\n")
# 追加寫入
with open('my_file.txt', 'a') as f:
f.write("追加內容\n")
# 讀取
with open('my_file.txt', 'r') as f:
for line in f:
print(line, end='')
在 Python 中,當我們想要一次性將一個序列(例如列表或元組)中的多個字符串寫入到一個檔案中時,,並且在每個字符串的末尾自動添加一個換行符。.writelines(seq) 方法是一個非常方便的選擇。
with open("my_file.txt", "w", encoding='utf-8') as file:
lines = ["第一行\n", "第二行\n", "第三行\n", "test\n"]
file.writelines(lines)
在 Python 中,print() 函數通常用來將資料輸出到終端(也就是我們平常看到的命令列)。然而,透過指定 file 參數,我們可以將輸出導向到一個檔案中,而不是顯示在螢幕上。
-data: 你想要寫入檔案的資料,可以是字符串、數字、或是更複雜的資料結構。
-file: 要寫入的檔案對象。這個對象通常是透過 open() 函數取得的。
with open('my_file.txt', 'w') as file:
data = "Hello, world!\n"
print(data, file=file)
with open('movieList.txt', 'w', encoding='utf-8')as f:
movies = ['movie1', 'movie2', 'movie3']
print(movies, file=f)
option
seek() 函數在 Python 中主要用於在檔案中移動讀寫位置。想像一個檔案就像是一本書,而 seek() 就如同將書籤移動到書的任意頁面。透過這個函數,我們可以精準地控制從檔案的哪個位置開始讀取或寫入資料。
offset: 偏移量,表示要移動的位元組數。可以是正數(向後移動)、負數(向前移動)或 0(無移動)。
whence: 可選參數,表示偏移量的參考位置。
0 (os.SEEK_SET):檔案的起始位置
1 (os.SEEK_CUR):當前的文件位置
2 (os.SEEK_END):檔案的結尾位置
隨機存取檔案:
with open('my_file.txt', 'r+') as f:
# 移動到檔案末尾
f.seek(0, 2)
# 在末尾追加一行
f.write('\nThis is a new line.')
# 移動到檔案開頭
f.seek(0)
# 讀取前10個位元組
data = f.read(10)
print(data)
注意事項
二進位模式 vs. 文字模式: 在二進位模式下,seek() 操作的是位元組,而在文字模式下,seek() 操作的是字元。
不同系統的換行符: 在不同作業系統中,換行符的表示方式不同。Windows 使用 \r\n,而 Unix/Linux 使用 \n。
文件指針: seek() 操作會改變文件指針的位置,後續的讀寫操作都會從新的位置開始。
檔案類型: 不是所有的檔案都支持隨機存取,例如壓縮檔案或資料庫檔案。
結語
seek() 函數為我們提供了對檔案進行精細控制的能力,在處理各種檔案操作時都非常有用。通過熟練掌握 seek() 的用法,我們可以更靈活地處理檔案資料。
常見的應用場景:
編輯器: 在編輯器中,seek() 可以用於實現光標的移動和內容的插入、刪除。
資料庫: 資料庫系統中,seek() 可以用於定位到特定的記錄。
網路通訊: 在網路通訊中,seek() 可以用於處理接收到的資料包。