zoukankan      html  css  js  c++  java
  • python文件操作(with关键字)

    python文件操作

    with关键字的使用

           with:我们称之为上下文管理器,很多需要手动关闭的连接比如文件连接、socket连接、数据库连接等都能使用with关键字自动关闭连接。

    with open('aaa.txt','r',encoding='utf8') as file:
        file.read()    #不需要手动关闭文件,with关键字会帮助我们关闭文件
    

      

           with关键字后面对象,需要实现__enter__ 和 __exit__魔法方法。

           对于系统资源如文件、数据库连接、socket而言,应用程序打开这些资源并执行完业务逻辑之后,必须做的一件事就是要关闭(断开)该资源。

           比如Python程序打开一个文件,往文件中写内容,写完之后,就要关闭该文件,否则会出现什么情况呢?极端情况下会出现“Too many open files“的错误,因为系统允许你打开的最大文件数量是有限的。

           同样,对于数据库,如果连接数过多而没有及时关闭的话,就可能会出现“Can not connect to MySQ server Too many connections”,因为数据库连接是一种非常昂贵的资源,不可能无限制的被创建。

           来看看如何正确关闭一个文件:

           1、普通版

    def m1():
        f=open("output.txt","w")
        f.writer("我学Python")
        f.close()
    

           这样写有一个潜在的问题,如果在调用write的过程中,出现了异常进而导致后续代码无法继续执行,close方法无法被正常调用,因此资源就会一直被该程序占用着。那么该如何改进代码呢?

           2、进阶版

    def m2():
        f=open("output.txt","w")
        try:
            f.writer("我学python")
        except IOWrror:
            print("oops error")
        finally:
            f.close()
    

      改良版本的程序是对可能发生异常的代码进行try捕获,使用try/finally语句,该语句表示如果在try代码块中程序出现了异常,后续代码就不在执行,而直接跳转到except代码块。而无论如何,finally块的代码最终都会被执行。因此,只要把close放在finally代码中,文件就一定会关闭。

           

           3、高级版

    def m3():
        with open("output.txt","w") as f:
            f.write("我学python")
    

      一种更加简洁、优雅的方式就是使用with关键字。open方法的返回值赋值给变量f,当离开with代码块的时候,系统会自动调用f.close()方法,with的作用和使用try/finally语句是一样的。

     

           上下文管理器

           with语句实质就是一个上下文管理器,with语句后的对象都会有__enter__() 和 __exit__()方法。在进入到上下文时,会自动调用__enter__()方法,程序正常执行完成或出现异常中断的时候,就会调用 __exit__()方法。
    class Demo:
        def __enter__(self):
            print('python')
        def __exit__(self, exc_type, exc_val, exc_tb):
            print('world')
    
    with Demo() as d:
        print('hello')
    运行结果:
            python
            hello
            world
    

      

  • 相关阅读:
    spring中的bean
    在Eclipse上使用Maven
    类加载机制
    jstack简单使用,定位死循环、线程阻塞、死锁等问题
    “心若冰清,天塌不惊”,道家文化原文欣赏,你值得收藏研读!
    【干货分享】可能是东半球最全的.NET Core跨平台微服务学习资源
    Oracle 查询两个时间段内的所有日期列表
    SQL Server中获取指定时间段内的所有月份
    天气预报接口
    pixel和nexus设备安卓9.0/8.1/7.1.x/6.x WiFi和信号图标出现叉x号或者感叹号的消除办 法
  • 原文地址:https://www.cnblogs.com/shixiaoxun/p/14498280.html
Copyright © 2011-2022 走看看