python with statement 进行文件操作指南


Posted in Python onAugust 22, 2014

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

Python 相关文章推荐
python网络编程学习笔记(10):webpy框架
Jun 09 Python
python字符类型的一些方法小结
May 16 Python
python turtle库画一个方格和圆实例
Jun 27 Python
Python3 执行Linux Bash命令的方法
Jul 12 Python
flask实现验证码并验证功能
Dec 05 Python
python 实现二维字典的键值合并等函数
Dec 06 Python
Pytorch技巧:DataLoader的collate_fn参数使用详解
Jan 08 Python
在Tensorflow中查看权重的实现
Jan 24 Python
flask框架渲染Jinja模板与传入模板变量操作详解
Jan 25 Python
简单了解python shutil模块原理及使用方法
Apr 28 Python
Python坐标轴操作及设置代码实例
Jun 04 Python
Python语法学习之进程的创建与常用方法详解
Apr 08 Python
Python中还原JavaScript的escape函数编码后字符串的方法
Aug 22 #Python
python错误:AttributeError: 'module' object has no attribute 'setdefaultencoding'问题的解决方法
Aug 22 #Python
Python升级提示Tkinter模块找不到的解决方法
Aug 22 #Python
Python实现多行注释的另类方法
Aug 22 #Python
Python利用pyHook实现监听用户鼠标与键盘事件
Aug 21 #Python
Python发送Email方法实例
Aug 21 #Python
Python生成验证码实例
Aug 21 #Python
You might like
PHP4实际应用经验篇(1)
2006/10/09 PHP
如何在PHP中使用正则表达式进行查找替换
2013/06/13 PHP
phpphp图片采集后按原路径保存图片示例
2014/02/18 PHP
PHP list() 将数组中的值赋给变量的简单实例
2016/06/13 PHP
PHP基于DateTime类解决Unix时间戳与日期互转问题【针对1970年前及2038年后时间戳】
2018/06/13 PHP
实例讲解PHP表单
2020/06/10 PHP
JS解密入门之凭直觉解
2008/06/25 Javascript
Extjs中常用表单介绍与应用
2010/06/07 Javascript
Jquery实现仿新浪微博获取文本框能输入的字数代码
2013/02/22 Javascript
jQuery中click事件用法实例
2014/12/26 Javascript
详解JavaScript ES6中的模板字符串
2015/07/28 Javascript
JavaScript函数的一些注意要点小结及js匿名函数
2015/11/10 Javascript
jquery.cookie实现的客户端购物车操作实例
2015/12/24 Javascript
jquery点击改变class并toggle的实现代码
2016/05/15 Javascript
jQuery使用each方法与for语句遍历数组示例
2016/06/16 Javascript
JavaScript实现自动切换图片代码
2016/10/11 Javascript
浅析javaScript中的浅拷贝和深拷贝
2017/02/15 Javascript
SpringMVC+bootstrap table实例详解
2017/06/02 Javascript
Three.js开发实现3D地图的实践过程总结
2017/11/20 Javascript
Vue实现动态创建和删除数据的方法
2018/03/17 Javascript
微信小程序 MinUI组件库系列之badge徽章组件示例
2018/08/20 Javascript
Vue中axios的封装(报错、鉴权、跳转、拦截、提示)
2019/08/20 Javascript
[43:43]完美世界DOTA2联赛PWL S2 FTD.C vs Rebirth 第一场 11.22
2020/11/24 DOTA
Python 分享10个PyCharm技巧
2019/07/13 Python
Python算法中的时间复杂度问题
2019/11/19 Python
python中count函数简单用法
2020/01/05 Python
简单掌握CSS3将文字描边及填充文字颜色的方法
2016/03/07 HTML / CSS
丝芙兰美国官网:SEPHORA美国
2016/08/03 全球购物
世界最大的海报和艺术印刷商店:AllPosters.com
2017/02/01 全球购物
企业演讲稿范文
2013/12/28 职场文书
合伙经营协议书范本
2014/04/18 职场文书
保险公司客户经理岗位职责
2015/04/09 职场文书
酒店员工手册范本
2015/05/14 职场文书
2015年英语教师工作总结
2015/05/20 职场文书
龙猫观后感
2015/06/09 职场文书
golang三种设计模式之简单工厂、方法工厂和抽象工厂
2022/04/10 Golang