【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
前言:哈喽,大家好,今天给大家分享今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 …...

Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...

Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...

Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现指南针功能
指南针功能是许多位置服务应用的基础功能之一。下面我将详细介绍如何在HarmonyOS 5中使用DevEco Studio实现指南针功能。 1. 开发环境准备 确保已安装DevEco Studio 3.1或更高版本确保项目使用的是HarmonyOS 5.0 SDK在项目的module.json5中配置必要的权限 2. 权限配置 在mo…...

sshd代码修改banner
sshd服务连接之后会收到字符串: SSH-2.0-OpenSSH_9.5 容易被hacker识别此服务为sshd服务。 是否可以通过修改此banner达到让人无法识别此服务的目的呢? 不能。因为这是写的SSH的协议中的。 也就是协议规定了banner必须这么写。 SSH- 开头,…...