当前位置 博文首页 > python with statement 进行文件操作指南

    python with statement 进行文件操作指南

    作者:admin 时间:2021-07-12 18:34

    由于之前有一个项目老是要打开文件,然后用pickle.load(file),再处理。。。最后要关闭文件,所以觉得有点繁琐,代码也不简洁。所以向python with statement寻求解决方法。

    在网上看到一篇文章:http://effbot.org/zone/python-with-statement.htm是介绍with 的,参考着例子进行了理解。

    如果经常有这么一些代码段的话,可以用一下几种方法改进:

    代码段:

    set thing up
    try:
      do something
    except :
      handle exception
    finally:
      tear thing down
    

    案例1:

    假如现在要实现这么一个功能,就是打开文件,从文件里面读取数据,然后打印到终端,之后关闭文件。

    那么从逻辑上来说,可以抽取“打印到终端”为数据处理部分,应该可以独立开来作为一个函数。其他像打开、关闭文件应该是一起的。

    文件名为:for_test.txt

    方法1:

    用函数,把公共的部分抽取出来。
     

    #!/usr/bin/env python 
    from __future__ import with_statement  
    filename = 'for_test.txt' 
    def output(content): 
      print content 
    #functio solution 
    def controlled_execution(func): 
      #prepare thing 
      f = None 
      try: 
        #set thing up 
        f = open(filename, 'r') 
        content = f.read() 
        if not callable(func): 
          return 
        #deal with thing  
        func(content) 
      except IOError, e: 
        print 'Error %s' % str(e) 
      finally: 
        if f:  
          #tear thing down 
          f.close() 
    def test(): 
      controlled_execution(output) 
    test() 
    

     
    方法2:

    用yield实现一个只产生一项的generator。通过for - in 来循环。

    代码片段如下:

    #yield solution 
    def controlled_execution(): 
      f = None 
      try: 
        f = open(filename, 'r') 
        thing = f.read() 
        #for thing in f: 
        yield thing 
      except IOError,e: 
        print 'Error %s' % str(e) 
      finally: 
        if f:  
          f.close() 
    def test2(): 
      for content in controlled_execution(): 
        output(content) 
    

     

    方法3:

    用类的方式加上with实现。

    代码片段如下:
     

    #class solution 
    class controlled_execution(object): 
      def __init__(self): 
        self.f = None 
      def __enter__(self): 
        try: 
          f = open(filename, 'r') 
          content = f.read() 
          return content 
        except IOError ,e: 
          print 'Error %s' % str(e) 
          #return None 
      def __exit__(self, type, value, traceback): 
        if self.f: 
          print 'type:%s, value:%s, traceback:%s' % \ 
              (str(type), str(value), str(traceback)) 
          self.f.close() 
    def test3(): 
      with controlled_execution() as thing: 
        if thing: 
          output(thing) 
     
    

    方法4:

    用with实现。不过没有exception handle 的功能。

    def test4(): 
      with open(filename, 'r') as f: 
        output(f.read()) 
     
      print f.read() 
    

     最后一句print是用来测试f是否已经被关闭了。

        最后总结一下,写这篇文章的目的主要是受了一句话的刺激:“使用语言的好特性,不要使用那些糟糕的特性”!python真是有很多很优雅的好特性,路漫漫其修远兮,吾将上下而求索。。。

    jsjbwy