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性能优化技巧
Mar 09 Python
Python实现监控程序执行时间并将其写入日志的方法
Jun 30 Python
使用Nginx+uWsgi实现Python的Django框架站点动静分离
Mar 21 Python
python开发准备工作之配置虚拟环境(非常重要)
Feb 11 Python
基于Python的PIL库学习详解
May 10 Python
用python wxpy管理微信公众号并利用微信获取自己的开源数据
Jul 30 Python
Python 实现遥感影像波段组合的示例代码
Aug 04 Python
python离线安装外部依赖包的实现
Feb 13 Python
Python object类中的特殊方法代码讲解
Mar 06 Python
python中def是做什么的
Jun 10 Python
从零开始的TensorFlow+VScode开发环境搭建的步骤(图文)
Aug 31 Python
Python3实现英文字母转换哥特式字体实例代码
Sep 01 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
ie6 动态缩略图不显示的原因
2009/06/21 PHP
使用PHP备份MySQL和网站发送到邮箱实例代码
2013/11/28 PHP
PHP文件操作之获取目录下文件与计算相对路径的方法
2016/01/08 PHP
Yii2实现log输出到file及database的方法
2016/11/12 PHP
php json_encode与json_decode详解及实例
2016/12/13 PHP
PHP如何开启Opcache功能提升程序处理效率
2020/04/27 PHP
JS加ASP二级域名转向的代码
2007/05/17 Javascript
js parentElement和offsetParent之间的区别
2010/03/23 Javascript
ext 列表页面关于多行查询的办法
2010/03/25 Javascript
jquery创建一个新的节点对象(自定义结构/内容)的好方法
2013/01/21 Javascript
jquery如何实现锚点链接之间的平滑滚动
2013/12/02 Javascript
jquery复选框全选/取消示例
2013/12/30 Javascript
jQuery自定义事件的简单实现代码
2014/01/27 Javascript
用jquery的方法制作一个简单的导航栏
2014/06/23 Javascript
使用JQuery库提供的扩展功能实现自定义方法
2014/09/09 Javascript
JavaScript中this的9种应用场景及三种复合应用场景
2015/09/12 Javascript
实例讲解jquery与json的结合
2016/01/07 Javascript
gameboy网页闯关游戏(riddle webgame)--仿微信聊天的前端页面设计和难点
2016/02/21 Javascript
JS控制静态页面之间传递参数获取参数并应用的简单实例
2016/08/10 Javascript
es6基础学习之解构赋值
2018/12/10 Javascript
Vue实现导航栏点击当前标签变色功能
2020/08/19 Javascript
Vue看了就会的8个小技巧
2021/01/21 Vue.js
Python远程桌面协议RDPY安装使用介绍
2015/04/15 Python
Python如何快速实现分布式任务
2017/07/06 Python
Python切片操作实例分析
2018/03/16 Python
python单例模式实例解析
2018/08/28 Python
基于python历史天气采集的分析
2019/02/14 Python
Django的ListView超详细用法(含分页paginate)
2020/05/21 Python
python list的index()和find()的实现
2020/11/16 Python
pycharm 使用anaconda为默认环境的操作
2021/02/05 Python
中国领先的汽车保养服务平台:途虎养车
2019/10/18 全球购物
卫校护理专业毕业生求职信
2013/11/26 职场文书
2014年国庆节寄语
2014/09/19 职场文书
大雁塔英文导游词
2015/02/10 职场文书
2015年先进个人自荐书
2015/03/24 职场文书
pytorch 预训练模型读取修改相关参数的填坑问题
2021/06/05 Python