【Python】S1 基礎篇 P9 文件處理與異常處理技術

目錄

  • 文件讀取操作
    • 讀取文件的全部內容
    • 相對路徑和絕對路徑
    • 逐行訪問文件內容
  • 文件寫入操作
    • 寫入單行內容
    • 寫入多行內容
    • 結構化數據的存儲
  • 異常處理機制
    • 理解異常的工作原理
    • ZeroDivisionError異常示例
    • try-except語句塊的使用
    • else語句塊的正確使用
    • 靜默失敗的合理應用

在這里插入圖片描述

本文將深入探討Python中的文件處理技術,幫助開發者構建能夠高效處理大量數據的程序。同時,我們還將重點介紹異常處理機制,確保程序在面對意外情況時能夠優雅地處理錯誤而不是崩潰。此外,還將學習如何使用json模塊持久化存儲用戶數據,防止程序結束運行后數據丟失。

文件讀取操作

在數據分析和處理應用中,文件讀取是最基礎也是最重要的操作之一。無論是分析日志文件、處理配置信息還是讀取數據集,掌握文件讀取技術都是必不可少的。

讀取文件的全部內容

Python提供了 pathlib 模塊來優雅地處理文件路徑操作。相比傳統的 os.path 方式,pathlib 提供了更加面向對象和直觀的接口。

from pathlib import Path# 創建Path對象指向目標文件
file_path = Path('data/sample.txt')# 讀取文件全部內容
try:content = file_path.read_text(encoding='utf-8')print(f"文件內容長度:{len(content)} 字符")
except FileNotFoundError:print(f"文件 {file_path} 不存在")

read_text() 方法會一次性讀取整個文件內容并返回字符串對象。建議在讀取文件時顯式指定編碼格式,避免因編碼問題導致的亂碼。

相對路徑和絕對路徑

理解路徑概念對于文件操作至關重要:

  • 相對路徑: 相對于當前工作目錄的路徑,便于項目遷移和部署
  • 絕對路徑: 文件在文件系統中的完整路徑,具有唯一性
from pathlib import Path# 相對路徑示例
relative_path = Path('config/settings.json')# 絕對路徑示例
absolute_path = Path('/home/user/projects/data/input.csv')# 獲取當前工作目錄
current_dir = Path.cwd()
print(f"當前工作目錄:{current_dir}")# 將相對路徑轉換為絕對路徑
abs_path = relative_path.resolve()
print(f"絕對路徑:{abs_path}")

逐行訪問文件內容

對于大型文件,逐行處理能夠有效控制內存使用:

from pathlib import Pathfile_path = Path('logs/application.log')try:content = file_path.read_text(encoding='utf-8')lines = content.splitlines()# 逐行處理for line_num, line in enumerate(lines, 1):if 'ERROR' in line:print(f"第{line_num}行發現錯誤:{line.strip()}")except FileNotFoundError:print("日志文件不存在")

文件寫入操作

文件寫入是數據持久化的重要手段,Python提供了多種寫入方式來滿足不同需求。

寫入單行內容

from pathlib import Pathoutput_path = Path('output/result.txt')# 確保目錄存在
output_path.parent.mkdir(parents=True, exist_ok=True)# 寫入單行內容
message = "數據處理完成,共處理1000條記錄"
output_path.write_text(message, encoding='utf-8')

寫入多行內容

from pathlib import Pathreport_path = Path('reports/daily_summary.txt')# 準備多行內容
lines = ["=== 每日數據處理報告 ===","處理日期:2024-01-15","總記錄數:5000","成功處理:4950","失敗記錄:50","處理耗時:120秒"
]# 寫入多行內容
content = '\n'.join(lines)
report_path.write_text(content, encoding='utf-8')

結構化數據的存儲

在實際開發中,經常需要存儲列表、字典等復雜數據結構。JSON格式因其輕量級和跨平臺特性成為首選方案:

import json
from pathlib import Path# 存儲字典數據
user_data = {"users": [{"id": 1, "name": "張三", "email": "zhangsan@example.com"},{"id": 2, "name": "李四", "email": "lisi@example.com"}],"total": 2,"last_updated": "2024-01-15T10:30:00"
}data_path = Path('data/users.json')# 使用json.dumps()序列化并寫入文件
try:with open(data_path, 'w', encoding='utf-8') as f:json.dump(user_data, f, ensure_ascii=False, indent=2)print("數據保存成功")
except IOError as e:print(f"文件寫入失敗:{e}")# 讀取JSON數據
try:with open(data_path, 'r', encoding='utf-8') as f:loaded_data = json.load(f)print(f"加載了 {loaded_data['total']} 個用戶記錄")
except (FileNotFoundError, json.JSONDecodeError) as e:print(f"數據加載失敗:{e}")
  • json.dump() 函數說明:
    • f:文件類對象,f 表示 file
    • ensure_ascii=False:不要將所有內容都轉換為ASCII字符
    • indent=2:默認為 None,即所有 JSON 字符會被壓縮成一行,沒有多余的空格和換行。

異常處理機制

異常處理是構建健壯應用程序的核心技術。Python通過異常對象來封裝錯誤信息,并提供了完善的異常處理機制。

理解異常的工作原理

當程序遇到錯誤時,Python解釋器會創建一個異常對象,包含錯誤類型、錯誤信息和發生位置等詳細信息。如果異常未被捕獲,程序將終止并顯示 traceback 信息。

ZeroDivisionError異常示例

def calculate_average(numbers):"""計算數字列表的平均值"""if not numbers:raise ValueError("輸入列表不能為空")try:total = sum(numbers)count = len(numbers)average = total / countreturn averageexcept ZeroDivisionError:print("錯誤:除零操作")return Noneexcept TypeError as e:print(f"錯誤:數據類型不正確 - {e}")return None# 測試用例
test_data = [10, 20, 30, 40]
result = calculate_average(test_data)
print(f"平均值:{result}")

try-except語句塊的使用

try-except 語句塊提供了結構化的異常處理方式:

from pathlib import Path
import jsondef load_config(config_path):"""加載配置文件"""try:path = Path(config_path)content = path.read_text(encoding='utf-8')config = json.loads(content)return configexcept FileNotFoundError:print(f"配置文件 {config_path} 不存在")return {}except json.JSONDecodeError as e:print(f"配置文件格式錯誤:{e}")return {}except PermissionError:print("沒有權限訪問配置文件")return {}except Exception as e:print(f"未知錯誤:{e}")return {}# 使用示例
config = load_config('config/app.json')

else語句塊的正確使用

else 語句塊只有在 try 塊成功執行且沒有異常時才會執行,適合放置依賴于 try 塊成功執行的代碼:

def process_file(file_path):"""處理文件并生成報告"""try:path = Path(file_path)content = path.read_text(encoding='utf-8')lines = content.splitlines()except FileNotFoundError:print(f"文件 {file_path} 不存在")except PermissionError:print("沒有文件訪問權限")else:# 只有文件成功讀取后才執行此部分print(f"文件讀取成功,共 {len(lines)} 行")# 生成處理報告report = {"file_path": str(file_path),"total_lines": len(lines),"non_empty_lines": len([line for line in lines if line.strip()]),"processed_at": "2024-01-15T10:30:00"}# 保存報告report_path = Path('reports/processing_report.json')with open(report_path, 'w', encoding='utf-8') as f:json.dump(report, f, ensure_ascii=False, indent=2)print("處理報告已生成")

靜默失敗的合理應用

在某些場景下,我們希望程序在遇到特定異常時繼續運行而不顯示錯誤信息。這種做法稱為"靜默失敗",但應該謹慎使用:

import json
from pathlib import Pathdef load_user_preferences(user_id):"""加載用戶偏好設置,如果失敗則返回默認設置"""pref_file = Path(f'preferences/user_{user_id}.json')try:with open(pref_file, 'r', encoding='utf-8') as f:preferences = json.load(f)except (FileNotFoundError, json.JSONDecodeError, PermissionError):# 靜默處理異常,返回默認設置preferences = {"theme": "light","language": "zh-CN","notifications": True}return preferences# 靜默失敗適用場景:
# 1. 配置文件不存在時使用默認配置
# 2. 可選功能失敗時不影響主要功能
# 3. 日志記錄失敗時不中斷業務流程# 注意:即使是靜默失敗,也應該在適當的地方記錄日志
def safe_log_action(action, user_id):"""安全記錄用戶操作,失敗時不影響主業務"""try:log_entry = {"timestamp": "2024-01-15T10:30:00","user_id": user_id,"action": action}log_path = Path('logs/user_actions.json')# 讀取現有日志if log_path.exists():with open(log_path, 'r', encoding='utf-8') as f:logs = json.load(f)else:logs = []# 添加新日志并保存logs.append(log_entry)with open(log_path, 'w', encoding='utf-8') as f:json.dump(logs, f, ensure_ascii=False, indent=2)except Exception:# 靜默失敗,但在生產環境中應該記錄到系統日志pass  # 日志記錄失敗不應影響主要業務邏輯

通過掌握這些文件處理和異常處理技術,你將能夠構建更加健壯和可靠的Python應用程序。


2025.09 宣武門

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/96440.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/96440.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/96440.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

分布式事務實戰手冊:從四場業務災難看方案選型與落地陷阱

在分布式系統的穩定性戰役中,數據一致性問題如同潛伏的暗礁。某生鮮電商因分布式事務設計缺陷,在春節促銷期間出現"下單成功但無庫存發貨"的悖論,3小時內產生2300筆無效訂單,客服投訴量激增300%;某銀行轉賬系…

Java算法題中的輸入輸出流

在Java算法題中,處理輸入輸出主要依賴系統流(System.in和System.out),常用的方法總結如下: 一、輸入方法(讀取系統輸入) 主要通過java.util.Scanner類或BufferedReader類實現,適用于…

墨水屏程序

EPD Reader 基于ESP32-C3的電子墨水屏閱讀器,支持ap 配網、sntp 時間同步、txt閱讀、天氣預報、顯示節假日信息、農歷顯示、自動休眠、web配置等功能。這是在另一個項目 一個rust embassy esp32c3 的練習項目-CSDN博客的基礎上修改的 。 界面比較粗糙,以…

Git 創建 SSH 密鑰

1.生成 SSH 密鑰 打開 Git Bash ssh-keygen -t ed25519 -C "your_email@example.com" 把 ”your_email@example.com“ 改成再 github 注冊的郵箱 系統會提示您三次輸入: 第一個提示:Enter file in which to save the key (/c/Users/86189/.ssh/id_ed25519): 直接…

當前 AI 的主流應用場景

當前AI技術已深度滲透至社會各領域,2025年的主流應用場景呈現出行業垂直化、交互自然化、決策自主化三大特征。以下從六大核心領域展開分析,結合最新技術突破與規模化落地案例,揭示AI如何重塑人類生產生活范式: 一、智能辦公與生產力革命 AI正從工具升級為「數字同事」,…

EI會議:第六屆電信、光學、計算機科學國際會議(TOCS 2025)

第六屆電信、光學、計算機科學國際會議(TOCS 2025)定于11月21-23日在中國南陽舉行,本屆會議以“電信、光學、計算機科學”為主題,旨在為相關領域的專家和學者提供一個探討行業熱點問題,促進科技進步,增加科…

回歸預測 | MATLAB基于GRU-Attention的多輸入單輸出回歸預測

代碼是一個基于 MATLAB 的深度學習時間序列預測模型,結合了 GRU(門控循環單元)和自注意力機制(Self-Attention),用于回歸預測任務。 一、主要功能 使用 GRU + Self-Attention 神經網絡模型對時間序列數據進行回歸預測,評估模型在訓練集和測試集上的性能,并可視化預測結…

【JavaEE】(24) Linux 基礎使用和程序部署

一、Linux 背景知識 Linux 的第一個版本開發者是 Linus,所以部分人會叫“林納斯”。Linux 只是一個開源的操作系統內核,有些公司/開源組織基于 Linux 內核,配套了不同的應用程序,構成不同的操作系統(比如 vivo、&#…

視覺SLAM第9講:后端1(EKF、非線性優化)

目標: 1.理解后端的概念; 2.理解以EKF為代表的濾波器后端的工作原理; 3.理解非線性優化的后端,明白稀疏性是如何利用的; 4.使用g2o和Ceres實際操作后端優化。 9.1 概述 9.1.1 狀態估計的概率解釋 1.后端優化引出 前段…

樓宇自控系統監控建筑變配電系統:功效體現在安全與節能層面

建筑變配電系統是保障建筑電力供應的 “心臟”,負責將外界高壓電轉化為建筑內設備可使用的低壓電,為暖通、照明、電梯等核心系統供電。傳統變配電管理依賴人工巡檢,不僅存在 “監測滯后、故障難預判” 的安全隱患,還因無法精準調控…

【Docker安裝使用常見問題匯總】

文章目錄1. wsl update failed: update failed:2.dockerDesktopLinuxEngine: The system cannot find the file specified.3. 中文語言包3.1. 下載中文包3.2 默認路徑如下:3.3 備份并替換 app.asar 文件:4. Get "https://registry-1.docker.io/v2/&…

Android面試指南(八)

目錄 1、Java語言相關 1.1、String的intern方法 1.2、HashMap的擴容 1.3、Java數組不支持泛型 1.4、泛型類型保留到運行時 1.5、匿名內部類使用的外部變量需要加final 2、Kotlin語言相關 3、設計模式 1、Java語言相關 1.1、String的intern方法 1)、String…

7、Matplotlib、Seaborn、Plotly數據可視化與探索性分析(探索性數據分析(EDA)方法論)

學習目標:掌握數據可視化的原理和工具,培養通過圖表洞察數據規律的能力,建立數據驅動的分析思維數據可視化是數據科學的重要組成部分,它將抽象的數字轉化為直觀的圖形,讓我們能夠快速識別模式、趨勢和異常。從基礎的柱…

Next系統學習(二)

SSR生命周期與實現詳細解答 19. 如果不使用框架,如何從零用React/VueNode.js實現一個簡單的SSR應用? React Node.js SSR實現步驟: 項目結構搭建 /project/client - 客戶端代碼/server - 服務端代碼/shared - 共享代碼服務端基礎設置 // server/index…

零代碼入侵:Kubernetes 部署時自動注入 kube-system UID 到 .NET 9 環境變量

在現代化 .net9 應用部署階段,零代碼入侵模式,自動獲取 kubernetes 命名空間 kube-system 的 UID,并其作為變量配置到應用。 以下是幾種實現方式: 方法一:使用 InitContainer Downward API 您可以通過 Kubernetes 的 …

基于Redis設計一個高可用的緩存

本文為您介紹,如何逐步設計一個基于Redis的高可用緩存。 目錄 業務背景 步驟一:寫一個最簡單的緩存設計 存在的問題:大量冷數據占據Redis內存 解決思路:讓緩存自主釋放 步驟二:為緩存設置超時時間 存在的問題&a…

從原理到實踐:LVS+Keepalived構建高可用負載均衡集群

從原理到實踐:LVSKeepalived構建高可用負載均衡集群 文章目錄從原理到實踐:LVSKeepalived構建高可用負載均衡集群一、為什么需要LVSKeepalived?二、核心原理:Keepalived與VRRP協議1. VRRP的核心思想2. Keepalived的三大功能三、LV…

iOS混淆工具實戰 在線教育直播類 App 的課程與互動安全防護

近年來,在線教育直播類 App 已成為學生與培訓機構的重要工具。無論是 K12 教育、職業培訓,還是興趣學習,App 中承載的課程視頻、題庫與互動邏輯都是極高價值的內容資產。 然而,教育直播應用同樣面臨多重安全風險:課程視…

第2節-過濾表中的行-BETWEEN

摘要: 在本教程中,您將學習如何在 WHERE 子句中使用 PostgreSQL 的 BETWEEN 運算符來檢查某個值是否在兩個值之間。 PostgreSQL BETWEEN 運算符 BETWEEN運算符是一種比較運算符,如果某個值介于兩個值之間,則返回true。 以下是 BETWEEN 運算符…

Windows 11 手動下載安裝配置 uv、配置國內源

Windows 11 手動下載安裝配置 uv、配置國內源 本文對應的講解視頻鏈接:https://www.bilibili.com/video/BV1WnYTzZEpW 文章目錄Windows 11 手動下載安裝配置 uv、配置國內源1. 下載、安裝、配置 uv2. 參考信息重要聲明: uv 的安裝有很多種方式&#xff…