Python3: 上下文管理器、with语法、同时打开两个文件

太长不看

使用with语句实现上下文管理器打开多个资源,例如打开两个文件:

import contextlib

@contextlib.contextmanager
def open_files(file1, file2):
    try:
        f1 = open(file1, 'r')
        f2 = open(file2, 'r')
        yield (f1, f2)
    finally:
        f1.close()
        f2.close()

with open_files('file1.txt', 'file2.txt') as (f1, f2):
    # 使用f1和f2读取文件内容
    pass

上下文管理器和with语法

在Python3中,上下文管理器是一种对象,类似装饰器,它一个包装任意格式的代码块,定义在进入和退出代码块时要执行的操作。上下文管理器一般用来保证在代码块执行完毕后,资源被正确地释放。即使内部代码出错,退出步骤也会执行。因此,上下文管理器一般用作资源自动释放、正确清理的一种方式。

上下文管理器可以使用with语句来使用,语法如下:

with expression [as variable]:
    with-block

其中,expression是一个返回上下文管理器对象的表达式,variable是一个可选的变量名,用于将上下文管理器对象赋值给变量。with-block是一个代码块,它包含要执行的代码。

当进入with语句时,上下文管理器的__enter__()方法被调用,它返回一个对象,该对象可以在代码块中使用。当代码块执行完毕时,上下文管理器的__exit__()方法被调用,它负责清理资源。

自定义上下文管理器

上下文管理器可以使用class语句或contextlib模块中的contextmanager装饰器来定义。例如,下面是一个使用class语句定义的上下文管理器:

class MyContext:
    def __enter__(self):
        # 进入代码块时执行的操作
        return self
    
    def __exit__(self, exc_type, exc_value, traceback):
        # 退出代码块时执行的操作
        pass

with MyContext() as obj:
    # 使用obj执行代码块中的操作
    pass

上面的代码中,MyContext类定义了__enter__()__exit__()方法,这些方法分别在进入和退出代码块时被调用。在with语句中,MyContext()创建了一个上下文管理器对象,并将其赋值给变量obj。在代码块中,可以使用obj执行操作。

contextlib模块中的contextmanager装饰器可以更方便地定义上下文管理器。例如,下面是一个使用contextmanager装饰器定义的上下文管理器:

from contextlib import contextmanager

@contextmanager
def my_context():
    # 进入代码块时执行的操作
    yield obj
    # 退出代码块时执行的操作

with my_context() as obj:
    # 使用obj执行代码块中的操作
    pass

上面的代码中,my_context()函数使用yield语句返回一个上下文管理器对象,并在yield语句前后执行进入和退出代码块时的操作。在with语句中,my_context()创建了一个上下文管理器对象,并将其赋值给变量obj。在代码块中,可以使用obj执行操作。

应用

使用with语句和contextlib模块中的contextmanager装饰器可以实现上下文管理器打开多个资源。

例如,打开两个文件:

import contextlib

@contextlib.contextmanager
def open_files(file1, file2):
    try:
        f1 = open(file1, 'r')
        f2 = open(file2, 'r')
        yield (f1, f2)
    finally:
        f1.close()
        f2.close()

with open_files('file1.txt', 'file2.txt') as (f1, f2):
    # 使用f1和f2读取文件内容
    pass

open_files函数中,使用tryfinally语句打开两个文件,并使用yield语句将文件对象作为元组返回。在with语句中,使用元组解包将文件对象赋值给变量f1f2,然后可以使用它们读取文件内容。最后,在finally语句中关闭文件。

参考

https://blog.csdn.net/Ernestjackson/article/details/126310354

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python 中,打开文件有两种主要方式:使用内置函数open()和使用with语句。下面分别介绍它们的用法。 1. 使用内置函数open() open()函数用于打开文件,并返回一个文件对象,通过该对象可以对文件进行读取或写入操作。该函数的语法如下: ``` file = open(filename, mode) ``` 其中,filename是文件名,mode是打开文件的模式,常用的模式有: - 'r':只读模式(默认)。 - 'w':覆盖写入模式,如果文件不存在则创建,如果存在则覆盖原有内容。 - 'x':独占写入模式,如果文件不存在则创建,如果存在则报错。 - 'a':追加写入模式,如果文件不存在则创建,如果存在则在文件末尾追加内容。 - 'b':二进制模式,用于打开非文本文件,例如图片、音频等。 - 't':文本模式,用于打开文本文件(默认)。 打开文件后,可以使用read()、readline()、readlines()等方法读取文件内容,也可以使用write()方法写入文件内容。最后,一定要记得使用close()方法关闭文件,以释放系统资源。 2. 使用with语句 with语句是 Python 中的一种上下文管理器,可以管理打开文件对象,避免忘记关闭文件而导致资源泄漏的问题。与open()函数一起使用时,语法如下: ``` with open(filename, mode) as file: # 对文件进行读取或写入操作 ``` 在with语句块中,可以使用file文件对象进行读取或写入操作,当with语句块结束时,文件会自动关闭。这样,即使出现异常,也不用担心文件没有关闭的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值