Python里处理文件with open写法的由来

本文介绍如何使用Python的with语句优雅地读写文件,避免手动关闭文件带来的资源泄露风险。通过with语句,可以自动调用文件对象的__enter__和__exit__方法,实现文件的自动关闭。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用python读写文件,一开始我们用的是:

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

f.read()

最后一步是调用close()方法关闭文件

f.close()

如果打开报错IOError,那后面的close也不会执行,因此,我们可以使用try语句来容错:

try: 
    f = open('/path/to/file', 'r') 
    print(f.read()) 
finally: 
    if f: 
        f.close()

但每次这样写就太冗长了,于是有了一种优雅的写法:

with open('/path/to/file', 'r') as f: 
    print(f.read())

 

==========================with是如何工作的==============================

 

#!/usr/bin/env python
# with_example01.py
 
class Sample:
    def __enter__(self):
        print "In __enter__()"
        return "Foo"
 
    def __exit__(self, type, value, trace):
        print "In __exit__()"
 
def get_sample():
    return Sample()
 
with get_sample() as sample:
    print "sample:", sample

with 后面跟的语句get_sample()返回的是一个Sample对象

with要求Sample对象必须有一个__enter__()方法,一个__exit__()方法

当get_sample()返回一个Sample对象时,会调用Sample的__enter__()方法,__enter__()方法的返回值将赋给as后面的变量

在with后面的代码块抛出任何异常或者成功执行完成时,__exit__()方法被执行,将调用前面返回对象的__exit__()方法。

异常抛出时,与之关联的type,value和stack trace传给__exit__()方法,因此抛出的异常会被打印出来

所以上面这段代码的输出应该是

In __enter__()
sample: Foo
In __exit__()

参考文章:

https://www.cnblogs.com/DswCnblog/p/6126588.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值