掌握Python文件操作:從基礎到高階的全方位探索

来源:https://www.cnblogs.com/xfuture/archive/2023/06/12/17474169.html
-Advertisement-
Play Games

**在本篇博客中,我們將全面、深入地探討Python中的文件操作。文件操作在Python編程中是不可或缺的一部分,它包含了打開、讀取、寫入和關閉文件等各種操作。我們將從基礎的文件操作講解到高級的文件處理技巧,以及如何優雅地使用Python進行文件操作。每一部分我們都會分享一些獨特的用法,並且附有具體 ...


在本篇博客中,我們將全面、深入地探討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!

更高級的文件處理:osshutil模塊

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!')

這段代碼會捕獲FileNotFoundErrorPermissionError,並分別列印出相應的錯誤消息。

使用pickle進行對象序列化和反序列化

Python的pickle模塊提供了將對象轉換為一種可以存儲到文件或在網路上傳輸的格式(這個過程稱為序列化),以及從這種格式重新構造對象(這個過程稱為反序列化)的功能。這是一種非常方便的方式來保存和載入Python對象。

import pickle

data = {
    '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 = 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產品業務負責人。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • # %00截斷 **介紹:** > 0x00,%00,/00 在url中 %00 表示ascll碼中的 0 ,而ascii中0作為特殊字元保留,表示字元串結束,所以當url中出現%00時就會認為讀取已結束。但是所謂的if攔截仍會讀取後面的尾碼達到繞過白名單的效果。 當前版本環境: PHP版本低於5. ...
  • > 本文介紹了一個簡單的學生信息管理系統,包括管理員登錄、重置學生密碼、添加、刪除和修改學生信息、查詢學生信息以及對學生成績進行排序等功能。該系統使用Python編寫,基於控制台交互 ## 實現思路 > 該系統分為兩個部分,管理員登錄和學生信息管理。在管理員登錄時,程式會要求用戶輸入用戶名和密碼進行 ...
  • 題目:生產者-消費者問題演算法的設計與實現 目 錄 1. 課題概述... 2 2. 合作分工... 2 3. 相關知識... 2 4. 系統分析... 2 5. 系統設計... 2 6. 系統運行測試界面截圖... 2 7. 總結與心得體會... 2 8. 源程式清單... 2 1. 課題概述 1.1 ...
  • ## 教程簡介 XML是一種簡單的基於文本的語言,旨在以純文本格式存儲和傳輸數據。它代表可擴展標記語言。 [Java XML入門教程](https://www.itbaoku.cn/tutorial/java_xml-index.html) - 從基本到高級概念的簡單步驟瞭解Java XML,其中包 ...
  • ## 教程簡介 Babel是一個JavaScript編譯器,允許開發人員使用最前沿的JavaScript編寫代碼,然後Babel將其轉換為老式的JavaScript,讓更多的瀏覽器能夠理解。 [BabelJS入門教程](https://www.itbaoku.cn/tutorial/babeljs- ...
  • > 參考: > > - [(35條消息) Qt事件迴圈及QEventLoop的使用_kupeThinkPoem的博客-CSDN博客](https://blog.csdn.net/kupepoem/article/details/121844578) > - [(35條消息) Qt消息機制:事件分發和 ...
  • 本文已收錄至Github,推薦閱讀 👉 [Java隨想錄](https://github.com/ZhengShuHai/JavaRecord) 微信公眾號:[Java隨想錄](https://mmbiz.qpic.cn/mmbiz_jpg/jC8rtGdWScMuzzTENRgicfnr91C5 ...
  • # 一、前言 2018年寫過一篇分庫分表的文章《[SpringBoot使用sharding-jdbc分庫分表](https://www.cnblogs.com/2YSP/p/9746981.html)》,但是存在很多不完美的地方比如: - sharding-jdbc的版本(1.4.2)過低,現在gi ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...