【Python】从基础到进阶(八):文件操作与上下文管理


文章目录
- 一、引言
- 二、Python文件操作基础
- 1. 打开文件
- 2. 读取文件
- 3. 写入文件
- 4. 文件指针定位
- 三、上下文管理
- 1. 使用`with`管理文件
- 2. 自定义上下文管理器
- 四、文件操作的最佳实践
- 五、案例:日志文件管理
- 1. 需求分析
- 2. 实现`Logger`类
- 六、结论

一、引言
在编程过程中,数据的存储与读取是必不可少的任务。文件操作是Python编程中的一个重要部分,通过文件操作,您可以将数据持久化存储在磁盘中,并在需要时读取这些数据。此外,上下文管理是Python中的一个强大工具,它可以简化资源管理,确保文件、网络连接等资源在使用完毕后能够正确关闭,避免内存泄漏和资源占用问题。
本篇文章将深入探讨Python中的文件操作与上下文管理,帮助您掌握如何在Python中处理文件以及如何高效管理资源。

二、Python文件操作基础
Python提供了一组内置函数用于文件的读写操作。常见的操作包括打开文件、读取文件内容、写入数据等。
1. 打开文件
在Python中,可以使用open()函数打开文件。open()函数的基本语法如下:
file = open('文件名', '模式')
其中,模式指定文件的操作模式,常用的模式如下:
'r':只读模式,默认值。如果文件不存在,会抛出错误。'w':写入模式,如果文件不存在,会创建新文件;如果文件存在,会覆盖内容。'a':追加模式,在文件末尾添加内容,不会覆盖原有内容。'b':以二进制模式打开文件(可与其他模式结合使用)。
2. 读取文件
可以使用read()、readline()和readlines()来读取文件内容:
# 打开并读取整个文件内容
with open('example.txt', 'r') as file:content = file.read()print(content)
read():读取整个文件的内容。readline():每次读取文件的一行。readlines():将文件的每一行作为列表的元素返回。
3. 写入文件
可以使用write()方法将数据写入文件:
# 写入数据到文件
with open('output.txt', 'w') as file:file.write("Hello, Python!")
4. 文件指针定位
seek()方法可以用于移动文件指针到指定位置。tell()方法返回当前文件指针的位置。
with open('example.txt', 'r') as file:print(file.tell()) # 输出当前文件指针位置file.seek(5) # 移动文件指针到第5个字节
三、上下文管理
在Python中,处理文件或其他资源时,必须保证在使用资源后正确释放它们。上下文管理通过with语句可以简化这一过程,确保资源在使用后被自动关闭。
1. 使用with管理文件
当使用open()函数时,如果没有使用with语句,必须手动调用close()方法来关闭文件。否则,可能会导致文件句柄未释放,产生资源泄漏问题。而使用with语句后,文件会在操作完成后自动关闭。
with open('example.txt', 'r') as file:content = file.read()
2. 自定义上下文管理器
除了文件操作,Python允许开发者通过实现__enter__()和__exit__()方法来自定义上下文管理器。这两个方法分别用于在进入和退出上下文时执行特定操作。
示例代码:
class MyContextManager:def __enter__(self):print("进入上下文")return selfdef __exit__(self, exc_type, exc_val, exc_tb):print("退出上下文")with MyContextManager() as manager:print("正在执行上下文中的操作")
在这个示例中,当进入with语句时,会调用__enter__()方法;而当退出with语句时,无论是否发生异常,都会调用__exit__()方法。
四、文件操作的最佳实践
- 使用
with语句管理文件:使用with语句能够自动管理文件资源,避免手动关闭文件可能导致的错误。 - 处理文件异常:通过异常处理机制,可以捕获文件操作中的错误,防止程序崩溃。
- 确保文件路径正确:在执行文件操作时,必须确保文件路径的正确性,避免文件找不到或路径错误。
五、案例:日志文件管理
为了更好地理解文件操作和上下文管理,我们来实现一个简单的日志文件管理器。该管理器可以记录程序运行过程中的重要事件,并将日志信息写入文件中。
1. 需求分析
- 实现一个日志管理类
Logger,能够记录日志信息并写入日志文件。 - 每次启动程序时,自动检查日志文件的大小,如果超过一定限制,则创建新的日志文件。
2. 实现Logger类
import osclass Logger:def __init__(self, file_name, max_size=1024):self.file_name = file_nameself.max_size = max_sizedef _rotate_log(self):"""检查文件大小并进行日志文件轮转"""if os.path.exists(self.file_name) and os.path.getsize(self.file_name) > self.max_size:base, ext = os.path.splitext(self.file_name)os.rename(self.file_name, f"{base}_old{ext}")def log(self, message):"""写入日志信息"""self._rotate_log()with open(self.file_name, 'a') as file:file.write(message + '\n')# 使用日志管理器
logger = Logger('app.log')logger.log("程序启动")
logger.log("执行某些操作")
在这个案例中,Logger类封装了日志记录的功能,并实现了日志文件的自动轮转。当日志文件超过指定大小时,自动重命名当前日志文件并创建新的日志文件。
六、结论
在本篇文章中,我们探讨了Python中的文件操作与上下文管理。通过学习文件读写、文件指针定位、异常处理,以及上下文管理器的用法,您可以更加灵活地处理文件操作,同时确保资源管理的安全性和高效性。
希望通过本篇文章,您能熟练掌握Python中的文件操作与上下文管理,编写出更加稳健、可靠的代码。
在下一篇文章中,我们将深入探讨Python的迭代器与生成器,继续提升Python编程技能,敬请期待!
相关文章:
【Python】从基础到进阶(八):文件操作与上下文管理
🔥 个人主页:空白诗 文章目录 一、引言二、Python文件操作基础1. 打开文件2. 读取文件3. 写入文件4. 文件指针定位 三、上下文管理1. 使用with管理文件2. 自定义上下文管理器 四、文件操作的最佳实践五、案例:日志文件管理1. 需求分析2. 实现…...
c#:System.Text.Json 的使用四(如何忽略[JsonPropertyName])
环境: .net 6.0vs2022 系列篇: 《c#:System.Text.Json 的使用一》 《c#:System.Text.Json 的使用二》 《c#:System.Text.Json 的使用三(从Newtonsoft迁移)》 《c#:System.Text.Json…...
【CPU】CPU的物理核、逻辑核、超线程判断及L1、L2、L3缓存、CacheLine和CPU的TBL说明
CPU物理核及L1、L2、L3及缓存 CPU缓存 CPU 缓存是一种用于存储临时数据以提高计算机程序性能的内存层次结构。它通常分为三个层次:L1(一级)、L2(二级)和L3(三级)缓存。缓存大小是CPU的重…...
NET WPF使用组件库HandyControl
一、背景 WPF原生控件提供的API功能不够强大,设置一般的功能都需要进行很复杂的配置和实现。 1.1 原生按钮控件 例如,原生控件<Button/> 默认效果是这样的: MainWindow.xaml代码: <Window x:Class"wpf_demo.Mai…...
计算机毕业设计之:教学平台微信小程序(
博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…...
VMware Fusion虚拟机Mac版 安装Win10系统教程
Mac分享吧 文章目录 Win10安装完成,软件打开效果一、VMware安装Windows10虚拟机1️⃣:准备镜像2️⃣:创建虚拟机3️⃣:虚拟机设置4️⃣:安装虚拟机(步骤和Win11安装步骤类似,此处相同步骤处没换…...
头戴式蓝牙耳机性价比高的有哪些?四款高能性价比机型对比推荐
在当今科技日新月异的时代,头戴式蓝牙耳机已经成为了我们日常生活中不可或缺的一部分,无论是通勤路上、健身房内还是家中休闲时,一副优质的头戴式蓝牙耳机都能为我们带来沉浸式的听觉体验,那么头戴式蓝牙耳机性价比高的有哪些&…...
Linux:make,Makefile
hello,各位小伙伴,本篇文章跟大家一起学习《Linux:make,Makefile》,感谢大家对我上一篇的支持,如有什么问题,还请多多指教 ! 如果本篇文章对你有帮助,还请各位点点赞&…...
基于代理的分布式身份管理方案
目的是使用分布式的联合计算分发去替换掉区块链中原有的类第三方可信中心的证书机制,更加去中心化。 GS-TBK Group Signatures with Time-bound Keys. CS-TBK 算法 Complete subtree With Time-bound Keys,该算法是用来辅助检测用户的签名是否有效&…...
VSCode开发ros程序无法智能提示的解决方法(一)
VSCode开发ros程序无法智能提示的解决方法(一) 问题解决 问题 在Ubuntu下使用vscode开发ros程序,无法进行智能提示。 解决 将 intelli Sense Engine 设置为 Tag Parser 即可。...
grep命令如何实现正则表达式搜索?
grep 命令支持使用正则表达式(Regular Expression,简称 regex)进行搜索 以下是一些使用正则表达式的基本示例: 搜索包含 “example” 的行: grep "example" file.txt搜索以 “abc” 开头的行: g…...
Vue报错 ‘vite‘ 不是内部或外部命令,也不是可运行的程序或批处理文件
报错 vue-project0.0.0 dev vite‘vite’ 不是内部或外部命令,也不是可运行的程序 或批处理文件。解决 第1步. 控制台输入 npm install -g create-vite第2步. 控制台输入 npm install -g vite第3步. 运行就ok啦...
emqx代理订阅主题的方法
需求:需要代理订阅主题 mqtt/MaxVision/# 5.0以上的版本 界面操作添加就可以5.0以下版本 修改emqx.config 文件 首先在EMQX Dashboard(web端)中模块 emqx_mod_subscription 要启用修改配置 #1.切换目录 cd /home/emqx/etc#2.编辑配置文件 emqx.config vim emqx.config#3.修…...
页面关键路径渲染详解
关键路径渲染 浏览器不会等待全部资源都下载完后才进行渲染,而是采用渐进式的渲染方式,本文就介绍一下这种渐进式的渲染方式。 当浏览器获取到用于呈现网页的资源后,通常就会开始渲染网页。那么究竟是在什么时候就会开始渲染? …...
错题集锦之C语言
直接寻址和立即寻址 算法的又穷性是指算法程序的运行时间是有限的 未经赋值的全局变量值不确定 集成测试是为了发现概要设计的错误 自然连接要求两个关系中进行比较的是相同的属性,并且进行等值连接,在结果中还要把重复的属性列去掉 赋值运算符 赋值…...
【2024华为杯数学建模竞赛】E题 解题思路 | 视频特征提取
这高速公路应急车道紧急启用模型 问题 1解题思路解题思路 问题 2解题思路 问题 3解题思路 问题 1 某路段(长度约5000m,行车道2应急车道1)上有四个视频观测点(见示意图1)。请基于该路段四个视频数据解决如下问题&#x…...
ubuntu 执行定时任务crontab -e 无法输入的问题
界面显示 GNU nano 4.8 /tmp/crontab.l0A1HJ/crontab # Edit this file to introduce tasks to be run by cron. # # Each task to run has to be defined t…...
快速响应:提升前端页面加载速度技巧的必知策略方案
在本文中,我们将深入探讨导致页面加载缓慢的常见原因,并分享一系列切实可行的优化策略,无论你是刚入门的新手,还是经验丰富的开发者,这些技巧都将帮助你提升网页性能,让你的用户体验畅快无阻。 相信作为前端…...
VUE-CLI配置全局SCSS变量
一.引入node-sass和sass-loader依赖 npm install --save-dev sass-loader node-sass 二. 在项目根目录中创建一个scss变量文件,比如constant.scss: 三.在vue.config.js文件中引入这个变量文件: // vue.config.js module.exports {css: {l…...
前端JavaScript导出excel,并用excel分析数据,使用SheetJS导出excel
前言:哈喽,大家好,今天给大家分享今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 …...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...
微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
