文件操作Tips,一次搞懂Python中open与with open的差异

news2024/9/29 4:18:37

前几天在群里看到,有小伙伴在问,为什么代码中打开文件有的时候用open,有的时候用with open,一会close,一会又没有close,真让人摸不着头脑。我们来看一看,这究竟是怎么回事。

Python中,open 是一个内置函数,用于打开文件进行读取、写入或其他文件操作。而 with open 则是一种使用上下文管理器来自动管理文件打开和关闭过程的语法糖,为文件操作提供了更安全、简洁的语法。

open 函数

当你直接使用 open 函数时,其基本语法如下:

file_object = open(file_path, mode='r', encoding=None, errors=None, buffering=-1, newline=None, closefd=True, opener=None)
  • • file_path:要打开的文件的路径。

  • • mode:指定打开文件的模式,如 'r' 代表只读,'w' 代表写入(会覆盖原有内容),'a' 代表追加等。

  • • encoding:指定文件的编码方式,如 'utf-8'

  • • 其他参数如 errorsbufferingnewlineclosefdopener 分别控制错误处理、缓冲策略、换行符处理等高级选项。

使用 open 函数后,你需要手动调用文件对象的 close() 方法来关闭文件,以释放系统资源。


f = open('example.txt', 'r')

content = f.read()

f.close()

这里的问题在于,如果在读写文件的过程中发生异常,可能导致 file.close() 没有被执行,从而造成文件资源未被正确释放。因此,在使用 open 函数而不借助 with 语句时,通常需要使用 try...finally 来确保文件总是会被关闭。


filename = 'example.txt'

try:

    file = open(filename, 'r')

    content = file.read()

finally:

    file.close()

with open 语句

with open 语句利用了 Python 的上下文管理协议(即实现了 __enter__ 和 __exit__ 方法的对象),它会在进入块时自动打开文件,并在离开块时(无论是否发生异常)自动调用 close 方法关闭文件。

这让代码更加简洁和安全,即使在读写过程中发生异常也是如此,这大大提高了代码的健壮性和资源管理的便捷性。

基本语法如下:


with open(file_path, mode='r', encoding=None) as file:

    # 在这里进行文件操作

    content = file.read()

# 文件在这里会自动关闭,无需调用 file.close()

举个🌰,下面是一个使用 with open 读取文件内容并打印到控制台。


# 假设我们有一个名为 example.txt 的文件,内容是我们想要读取的数据

# 文件路径根据实际情况进行调整


# 使用 with open 读取文件

with open('example.txt', 'r', encoding='utf-8') as file:

    # 逐行读取文件内容

    for line in file:

        # 打印每一行的内容

        print(line.strip()) 

这个例子中,example.txt 是我们假设要读取的文件名。通过 with open,我们以只读模式 ('r') 打开了这个文件,并指定了编码为 'utf-8' 来正确处理中文或其他非ASCII字符。然后,我们通过一个循环逐行读取文件内容,并使用 print 函数打印到控制台,strip() 方法用来去除每行末尾可能存在的换行符,使得输出更加整洁。当 with 代码块执行完毕后,文件自动关闭。

总结

  1. 1. 自动资源管理with open 通过 with 语句自动管理文件资源,确保文件在使用后被正确关闭,即使发生异常也不例外。而直接使用 open 需要显式调用 close(),否则可能导致文件句柄泄露。

  2. 2. 代码可读性和简洁性with open 使代码更加简洁、易读,因为不需要显式关闭文件,减少了出错的机会。

  3. 3. 异常处理:在 with 块中,如果发生了异常,finally 隐式地保证了 close() 方法的调用,这对于资源管理和错误恢复是非常重要的。

我们在写自动化代码的时候,推荐使用 with open 的方式来进行文件操作,以提高代码的安全性和可维护性。

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:【文末自行领取】

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2175765.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端测试最强教程 - 实现 fake http 和 fake db

因为想要写出完美的测试,我们就需要模拟各种接口状态,各种动态数据,要求再高点甚至需要模拟鉴权,那这就不是简单的覆盖方法可以实现的。 所以我们需要一些第三方依赖,下面介绍一下实现步骤。 实现步骤 step 1: 新增…

JSP 的 request 内置对象

文章目录 前言一、request 内置对象是什么?二、request 对象 1.访问请求参数2.在作用域中管理属性3.获取 cookie4.解决中文乱码5.获取客户端信息6.显示国际化信息总结 前言 我们在学习 JavaScript 的时候有了解过常用对象,这些对象可以在这门脚本语言中全…

java项目之作业管理系统设计与实现源码(springboot)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的作业管理系统设计与实现源码。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 作业管理系统…

怎么选择一款适合自己的蓝牙耳机?2024开放式耳机选购指南

在选择开放式耳机时,可以从以下几个要点着手: 佩戴舒适程度: 耳挂的设计:好的耳挂设计能让耳机稳稳地戴在耳朵上,且不会给耳部造成过多压迫。比如有些耳机配备了可调节的耳挂,能依照不同人的耳型和佩戴习…

WordPress 要求插件开发人员进行双因素身份验证

全球超过40%的网站由 WordPress 提供支持,其庞大的插件和主题生态系统在全球范围内提供了灵活性和定制性。然而,这种受欢迎程度也使其成为网络攻击的主要目标。 WordPress 将为所有插件和主题开发人员引入强制性双因素身份验证 (2FA),以应对…

Vue3动态导入后端路由

动态获取文件 // modules就是一个map,文件路径作为key,文件对象作为value const modulesimport.meta.glob(../views/**/*.vue)获取到的modules对象如下: 添加动态路由 import {createRouter, createWebHashHistory} from vue-routerconst m…

Vue项目开发注意事项

事项一:项目代码放在本地怎么运行起来 1、首先确定项目对应的node和npm版本 node下载地址 Index of /dist/https://nodejs.org/dist/ node 与 npm版本对应关系 Node.js — Node.js Releases 2、node卸载的时候,会自动把对应的npm卸载掉 情况1&…

【源码】询比价管理系统,招投标采购管理系统

前言: 随着互联网和数字技术的不断发展,企业采购管理逐渐走向数字化和智能化。数字化采购平台作为企业采购管理的新模式,能够提高采购效率、降低采购成本、优化供应商合作效率,已成为企业实现效益提升的关键手段。源码获取本文末…

vue3 实现文本内容超过N行折叠并显示“...展开”组件

1. 实现效果 组件内文字样式取决与外侧定义 组件大小发生变化时,文本仍可以省略到指定行数 文本不超过时, 无展开,收起按钮 传入文本发生改变后, 组件展示新的文本 2. 代码 文件名TextEllipsis.vue <template><div ref"compRef" class"wq-text-ellip…

新疆交投路桥桥梁公司:向“新”求“质”,积蓄发展新势能

向“新”求“质”谋发展&#xff0c;“发展新质生产力是推动高质量发展的内在要求和重要着力点&#xff0c;必须继续做好创新这篇大文章&#xff0c;推动新质生产力加快发展”。以新质生产力塑造国企新的核心竞争力成为实现高质量发展的关键内容&#xff0c;既具有重大理论意义…

在传销案件中数据库取证的分步指南

金字塔计划的特点是分层结构&#xff0c;主要由招募新成员的机制驱动。取证部门调查这些方案时&#xff0c;往往依靠数据库记录来分析这种结构。这些记录详细描述了上级和下级之间的关系&#xff0c;使调查人员能够描绘出组织的动态。在本文中&#xff0c;我们将探讨如何利用数…

如何用好通义灵码企业知识库问答能力?

通义灵码企业版&#xff1a;通义灵码企业标准版快速入门_智能编码助手_AI编程_智能编码助手通义灵码(Lingma)-阿里云帮助中心 通义灵码提供了基于企业知识库的问答检索增强的能力&#xff0c;在开发者使用通义灵码 IDE 插件时&#xff0c;可以结合企业知识库内上传的文档、文件…

23款奔驰E300立标升级23P智能辅助驾驶案例分享

《23 款奔驰 E300 立标升级 23P 智能辅助驾驶案例》 在汽车科技不断进步的今天&#xff0c;越来越多的车主开始追求更加智能、安全的驾驶体验。今天&#xff0c;我们就为大家带来一款 23 款奔驰 E300 立标升级 23P 智能辅助驾驶的精彩案例。 这辆 23 款奔驰 E300 立标原本就散…

业务调度 -- 线路单板中继模式

OTN网络中&#xff0c;线路板可以设置为中继模式&#xff0c;作为中继提高系统传输距离。当前设备支持“双向中继”与“单向中继”两种模式&#xff0c;不同的线路板支持其中的一种模式。单向中继与双向中继模式下支持“光中继”或“电中继”。 单向中继 VS. 双向中继 单向中…

DTOF(direct Time-of-Flight,直接飞行时间)

一、基本概念 1.1 定义 dToF&#xff0c;即直接飞行时间&#xff08;direct Time-of-Flight&#xff09;&#xff0c;是一种通过测量光脉冲发射出去并反射回来的时间差来直接计算距离的技术。 TOF应用场景非常多&#xff0c;电子消费品领域有人脸识别&#xff0c;照相机辅助对…

程序员数学 | 数学归纳法

目录 一、数学归纳法是什么二、使用编程来模拟数学归纳法的证明 人类做重复性的劳动没有效率&#xff0c;而计算机却能更快更准确的完成重复性劳动。所以以重复为特点的迭代法在编程中有着⼴泛的应⽤。实际项目中是否可以用不断更新变量值或者缩小搜索的区间范围的方法&#xf…

AniJS:无需编程的动画解决方案

前言 在网页设计中&#xff0c;动画效果能够显著提升用户体验&#xff0c;但传统的动画实现往往需要复杂的 JavaScript 代码。 AniJS 库的出现&#xff0c;为设计师和开发者带来了一种全新的动画实现方式&#xff0c;它通过简单的 HTML 属性就能创建出令人惊叹的动画效果。 介…

HTML5+JavaScript绘制闪烁的网格错觉

HTML5JavaScript绘制闪烁的网格错觉 闪烁的网格错觉&#xff08;scintillating grid illusion&#xff09;是一种视觉错觉&#xff0c;通过简单的黑白方格网格和少量的精心设计&#xff0c;能够使人眼前出现动态变化的效果。 闪烁的栅格错觉&#xff0c;是一种经典的视觉错觉…

柯桥小语种学习英语口语培训|被点名时,中文喊“到”,那英文喊什么?

"今日体育课&#xff0c;张老师准时点名。阳光下&#xff0c;同学们精神抖擞&#xff0c;一一应答到。课堂氛围活跃&#xff0c;准备充分&#xff0c;期待精彩训练。"被点名时&#xff0c;中文喊“到”&#xff0c;那英文喊什么&#xff1f; “到”用英语怎么说&…

在WPF中实现多语言切换的四种方式

在WPF中有多种方式可以实现多语言&#xff0c;这里提供几种常用的方式。 一、使用XML实现多语言切换 使用XML实现多语言的思路就是使用XML作为绑定的数据源。主要用到XmlDataProvider类. 使用XmlDataProvider.Source属性指定XML文件的路径或通过XmlDataProvider.Document指定…