【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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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…