视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
pythonwithstatement进行文件操作指南
2020-11-27 14:30:54 责编:小采
文档

由于之前有一个项目老是要打开文件,然后用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真是有很多很优雅的好特性,路漫漫其修远兮,吾将上下而求索。。

下载本文
显示全文
专题