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数组复制拷贝的实现方法
Jun 09 Python
python时间日期函数与利用pandas进行时间序列处理详解
Mar 13 Python
python实现自动发送邮件
Jun 20 Python
Python实现的拉格朗日插值法示例
Jan 08 Python
对Python实现累加函数的方法详解
Jan 23 Python
Python玩转加密的技巧【推荐】
May 13 Python
django搭建项目配置环境和创建表过程详解
Jul 22 Python
利用python实现短信和电话提醒功能的例子
Aug 08 Python
关于python3中setup.py小概念解析
Aug 22 Python
Python数据可视化:饼状图的实例讲解
Dec 07 Python
Python面向对象程序设计之静态方法、类方法、属性方法原理与用法分析
Mar 23 Python
Python中的协程(Coroutine)操作模块(greenlet、gevent)
May 30 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
2020年4月放送决定!第2期TV动画《邪神酱飞踢》视觉图&主题曲情报公开!
2020/03/06 日漫
使用array mutisort 实现按某字段对数据排序
2013/06/18 PHP
微信自定义菜单的创建/查询/取消php示例代码
2016/08/05 PHP
PHP基于IMAP收取邮件的方法示例
2017/08/07 PHP
ANT 压缩(去掉空格/注释)JS文件可提高js运行速度
2013/04/15 Javascript
jQuery获取注册信息并提示实现代码
2013/04/21 Javascript
jQuery+CSS3折叠卡片式下拉列表框实现效果
2015/11/02 Javascript
jQuery form插件之formDdata参数校验表单及验证后提交
2016/01/23 Javascript
深入理解javascript作用域第二篇之词法作用域和动态作用域
2016/07/24 Javascript
JS 根据子网掩码,网关计算出所有IP地址范围示例
2020/04/23 Javascript
完美解决IE9浏览器出现的对象未定义问题
2016/09/29 Javascript
Bootstrap基本样式学习笔记之表格(2)
2016/12/07 Javascript
JavaScript原生编写《飞机大战坦克》游戏完整实例
2017/01/04 Javascript
BootStrap Datetimepicker 汉化的实现代码
2017/02/10 Javascript
十分钟带你快速了解React16新特性
2017/11/10 Javascript
vue代码分割的实现(codesplit)
2018/11/13 Javascript
jQuery实现经典的网页3D轮播图封装功能【附源码下载】
2019/02/15 jQuery
微信小程序视图控件与bindtap之间的问题的解决
2019/04/08 Javascript
详解js获取video任意时间的画面截图
2019/04/17 Javascript
基于vue3.0.1beta搭建仿京东的电商H5项目
2020/05/06 Javascript
[58:54]EG vs RNG 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/18 DOTA
python二叉树遍历的实现方法
2013/11/21 Python
星球大战与Python之间的那些事
2016/01/07 Python
Python实现二维数组按照某行或列排序的方法【numpy lexsort】
2017/09/22 Python
在cmder下安装ipython以及环境的搭建
2018/10/19 Python
零基础使用Python读写处理Excel表格的方法
2019/05/02 Python
python 批量添加的button 使用同一点击事件的方法
2019/07/17 Python
python几种常用功能实现代码实例
2019/12/25 Python
解析PyCharm Python运行权限问题
2020/01/08 Python
Python+unittest+DDT实现数据驱动测试
2020/11/30 Python
计算机系毕业生推荐信
2013/11/06 职场文书
自荐信封面
2013/12/04 职场文书
通知范文怎么写
2015/04/16 职场文书
2015年前台接待工作总结
2015/05/04 职场文书
学习党史心得体会2016
2016/01/23 职场文书
用 Python 元类的特性实现 ORM 框架
2021/05/19 Python