在本篇博客中,我們將全面、深入地探討Python中的檔案操作,檔案操作在Python編程中是不可或缺的一部分,它包含了打開、讀取、寫入和關閉檔案等各種操作,我們將從基礎的檔案操作講解到高級的檔案處理技巧,以及如何優雅地使用Python進行檔案操作,每一部分我們都會分享一些獨特的用法,并且附有具體的示例代碼和輸出結果,在文章的最后,我們還將分享一些鮮為人知但非常實用的檔案操作技巧,
基礎檔案操作:打開、讀取、寫入和關閉檔案
Python使用內置的open()函式來打開一個檔案,它回傳一個檔案物件,常用的模式如下:'r'表示讀取,'w'表示寫入(會先清空原有檔案),'a'表示追加,'b'表示二進制模式,特別的,我們可以使用with關鍵字,這樣當我們完成操作后,檔案將自動關閉,
# 以讀取模式打開一個檔案
with open('file.txt', 'r') as file:
content = file.read()
print(content)
當你運行這段代碼,假設file.txt的內容是Hello, Python!,你會看到以下輸出:
Hello, Python!
檔案讀取:細粒度控制
除了一次性讀取整個檔案,我們還可以以更小的單位來讀取檔案,這對于處理大檔案時非常有用,可以有效控制記憶體的使用,
with open('file.txt', 'r') as file:
while True:
line = file.readline()
if not line:
break
print(line, end='')
這段代碼會逐行讀取file.txt檔案的內容并列印,其中,end=''是為了防止print函式在每次列印后都插入一個換行符,因為從檔案中讀取的每一行都已經帶有一個換行符,
檔案寫入:內容追加與覆寫
我們使用寫入模式('w')或追加模式('a')來寫入檔案,這里有一個小技巧:如果你的程式需要頻繁寫入檔案,那么在寫入時使用\n來換行會比使用write()函式后再使用write('\n')函式來插入新行更有效率,
with open('file.txt', 'a') as file:
file.write('Hello, Python!\n')
這段代碼會在file.txt檔案的末尾追加一行Hello, Python!,
更高級的檔案處理:os和shutil模塊
Python的os模塊和shutil模塊為我們提供了更高級的檔案操作功能,如重命名檔案、洗掉檔案、創建
目錄、復制檔案等,
import os
import shutil
# 創建一個新的目錄
os.mkdir('new_folder')
# 重命名檔案
os.rename('old.txt', 'new.txt')
# 復制檔案
shutil.copy2('src.txt', 'dst.txt')
# 洗掉檔案
os.remove('file_to_delete.txt')
運行這段代碼會按順序執行上述檔案操作,
檔案編碼:處理不同編碼格式的檔案
在處理檔案時,我們可能會遇到各種不同的編碼格式,如UTF-8, ASCII, ISO-8859-1等,Python的open()函式允許我們通過encoding引數來指定檔案的編碼方式,
with open('file.txt', 'r', encoding='utf-8') as file:
content = file.read()
print(content)
如果你嘗試讀取一個包含非ASCII字符的文本檔案,但沒有提供正確的編碼引數,Python可能會拋出UnicodeDecodeError,在這種情況下,你需要知道檔案的正確編碼格式才能正確地讀取檔案,
# 嘗試讀取一個包含非ASCII字符的檔案,但沒有指定正確的編碼格式
try:
with open('file.txt', 'r') as file:
content = file.read()
except UnicodeDecodeError:
print("UnicodeDecodeError occurred!")
這段代碼會捕獲UnicodeDecodeError并列印一個錯誤訊息,
檔案例外處理:確保代碼的健壯性
在檔案操作中,我們可能會遇到各種例外情況,例如檔案不存在、沒有讀取/寫入權限等,我們可以使用Python的例外處理機制來捕獲這些例外并作出相應的處理,
try:
with open('nonexistent_file.txt', 'r') as file:
content = file.read()
except FileNotFoundError:
print('File does not exist!')
except PermissionError:
print('No permission to read the file!')
這段代碼會捕獲FileNotFoundError和PermissionError,并分別列印出相應的錯誤訊息,
使用pickle進行物件序列化和反序列化
Python的pickle模塊提供了將物件轉換為一種可以存盤到檔案或在網路上傳輸的格式(這個程序稱為序列化),以及從這種格式重新構造物件(這個程序稱為反序列化)的功能,這是一種非常方便的方式來保存和加載Python物件,
import pickle
data = https://www.cnblogs.com/xfuture/p/{'name': 'John',
'age': 30,
'pets': ['cat', 'dog']
}
# 序列化并保存到檔案
with open('data.pkl', 'wb') as file:
pickle.dump(data, file)
# 從檔案加載并反序列化
with open('data.pkl', 'rb') as file:
loaded_data = https://www.cnblogs.com/xfuture/p/pickle.load(file)
print(loaded_data)
運行這段代碼,你會看到以下輸出:
{'name': 'John', 'age': 30, 'pets': ['cat', 'dog']}
這就是原始的data字典物件,
檔案路徑處理
在處理檔案路徑時,Python的os.path模塊提供了一系列函式來決議、構造和修改檔案路徑,這些函式都是跨平臺的,因此無論你的程式運行在Windows、macOS還是Linux上,都可以安全地使用它們,
import os
# 獲取檔案的絕對路徑
abs_path = os.path.abspath('file.txt')
print(f'Absolute path: {abs_path}')
# 獲取檔案所在的目錄
dir_name = os.path.dirname(abs_path)
print(f'Directory: {dir_name}')
# 獲取檔案的基本名和擴展名
base_name = os.path.basename(abs_path)
print(f'Base name: {base_name}')
root, ext = os.path.splitext(base_name)
print(f'Root: {root}, Extension: {ext}')
假設file.txt位于/home/user/documents/目錄下,運行這段代碼會輸出:
Absolute path: /home/user/documents/file.txt
Directory: /home/user/documents
Base name: file.txt
Root: file, Extension: .txt
One More Thing: 檔案遍歷和搜索
Python的os模塊提供了一個os.walk()函式,這是一個簡單易用但強大的工具,用于在目錄樹中生成檔案名,結合fnmatch模塊,我們可以實作對檔案的模式匹配搜索,
import os
import fnmatch
def find(pattern, path):
result = []
for root, dirs, files in os.walk(path):
for name in fnmatch.filter(files, pattern):
result.append(os.path.join(root, name))
return result
# 查找當前目錄及其所有子目錄中的所有.txt檔案
print(find('*.txt', '.'))
假設當前目錄及其子目錄下有file1.txt, file2.txt, sub/file3.txt三個檔案,運行這段代碼會輸出:
['./file1.txt', './file2.txt', './sub/file3.txt']
我們希望你能從這篇博客中學到Python檔案操作的各種技巧,并能在你的Python編程之旅中發揮作用,如果你有任何問題或想法,歡迎留言交流,
如有幫助,請多關注
個人微信公眾號:【Python全視角】
TeahLead_KrisChang,10+年的互聯網和人工智能從業經驗,10年+技術和業務團隊管理經驗,同濟軟體工程本科,復旦工程管理碩士,阿里云認證云服務資深架構師,上億營收AI產品業務負責人,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/554947.html
標籤:Python
下一篇:返回列表
