美文网首页
Python中with open用法及原理

Python中with open用法及原理

作者: 羋学僧 | 来源:发表于2023-01-12 11:43 被阅读0次

由于文件读写时都有可能产生IOError,一旦出错,后面的f.close()就不会调用。所以,为了保证无论是否出错都能正确地关闭文件,我们可以使用try ... finally来实现:

def read_file():
    try:
        f = open('sawako', 'r')
        try:
            print(''.join(f.readlines()))
        except:
            print('error occurs while reading file')
        finally:
            f.close()
    except:
        print("rror occurs while reading file")
read_file()

执行结果:

rror occurs while reading file

这样的操作太麻烦了,可以通过with open语法来代替:

def readFile():
    try:
        with open('mio', 'r') as f:
            print((''.join(f.readlines())))
    except:
        print('error occurs while reading file')
readFile()

执行结果与上例相同。这和前面的try ... finally是一样的,但是代码更佳简洁,并且不必调用f.close()方法。

底层原理

with语句的底层,其实是很通用的结构,允许使用上下文管理器(context manager)。上下文管理器实际是指一种支持__enter____exit__这两个方法的对象:

  • __enter__方法是不带参数的,它会在进入with语句块时被调用,即将其返回值绑定到as关键字之后的变量上
  • __exit__方法则带有3个参数:异常类型、异常对象和异常回溯。在离开方法时这个函数会被调用(带有通过参数提供的,可以引发的异常)。如果__exit__返回的是false,那么所有的异常都将不被处理
    代码示例:
class OperateTest(object):

    def open(self):
        print("此处打开文件了!")
        
    def close(self):
        print("此处关闭文件了!")
        
    def operate(self, txt_file):
        print("文件处理中!%s" % txt_file)
        
    def __enter__(self):
        self.open()
        return self
        
    def __exit__(self, exc_type, exc_val, exc_tb):
        self.close()
        
with OperateTest() as fp:
    fp.operate("text_file")

执行返回结果:

此处打开文件了!
文件处理中!text_file
此处关闭文件了!

综上,文件是可以被用作上下文管理器。他们的enter方法返回文件本省对象,exit方法则关闭文件,也就是把我们的定义的方法,添加到系统默认调用的方法中进行二次封装,以此来达到简化代码的效果

相关文章

网友评论

      本文标题:Python中with open用法及原理

      本文链接:https://www.haomeiwen.com/subject/eoxwcdtx.html