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 相关文章推荐
Django静态资源URL STATIC_ROOT的配置方法
Nov 08 Python
python3中str(字符串)的使用教程
Mar 23 Python
用python找出那些被“标记”的照片
Apr 20 Python
Python实现嵌套列表去重方法示例
Dec 28 Python
分享一下Python数据分析常用的8款工具
Apr 29 Python
Python动态赋值的陷阱知识点总结
Mar 17 Python
python实现文件批量编码转换及注意事项
Oct 14 Python
Django框架模板用法入门教程
Nov 04 Python
Python实现序列化及csv文件读取
Jan 19 Python
TensorFlow设置日志级别的几种方式小结
Feb 04 Python
Python导入数值型Excel数据并生成矩阵操作
Jun 09 Python
python利用while求100内的整数和方式
Nov 07 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
如何在PHP中使用Oracle数据库(5)
2006/10/09 PHP
php5.2.0内存管理改进
2007/01/22 PHP
PHP实现的简单路由和类自动加载功能
2018/03/13 PHP
用jquery来定位
2007/02/20 Javascript
很可爱的输入框
2008/08/03 Javascript
JavaScript中两个感叹号的作用说明
2011/12/28 Javascript
jquery特效 幻灯片效果示例代码
2013/07/16 Javascript
JavaScript中圆括号()和方括号[]的特殊用法疑问解答
2013/08/06 Javascript
使用Chart.js图表库制作漂亮的响应式表单
2015/10/28 Javascript
有关jQuery中parent()和siblings()的小问题
2016/06/01 Javascript
内容滑动切换效果jquery.hwSlide.js插件封装
2016/07/07 Javascript
JS设置CSS样式的方式汇总
2017/01/21 Javascript
vue实现裁切图片同时实现放大、缩小、旋转功能
2018/03/02 Javascript
angular2组件中定时刷新并清除定时器的实例讲解
2018/08/31 Javascript
JS返回页面时自动回滚到历史浏览位置
2018/09/26 Javascript
教你完全理解ReentrantLock重入锁
2019/06/03 Javascript
JS实现iframe中子父页面跨域通讯的方法分析
2020/03/10 Javascript
Vue如何基于vue-i18n实现多国语言兼容
2020/07/17 Javascript
由Python运算π的值深入Python中科学计算的实现
2015/04/17 Python
在Python的web框架中配置app的教程
2015/04/30 Python
Python中类的初始化特殊方法
2017/12/01 Python
Python实现朴素贝叶斯分类器的方法详解
2018/07/04 Python
python3中os.path模块下常用的用法总结【推荐】
2018/09/16 Python
django框架实现模板中获取request 的各种信息示例
2019/07/01 Python
python实现代码统计程序
2019/09/19 Python
以SQLite和PySqlite为例来学习Python DB API
2020/02/05 Python
keras CNN卷积核可视化,热度图教程
2020/06/22 Python
python 30行代码实现蚂蚁森林自动偷能量
2021/02/08 Python
New Balance比利时官方网站:购买鞋子和服装
2021/01/15 全球购物
工作表现自我评价
2014/02/08 职场文书
知识竞赛主持词
2014/03/26 职场文书
大学生毕业求职信
2014/06/12 职场文书
警察正风肃纪剖析材料
2014/10/16 职场文书
在职证明格式样本
2015/06/15 职场文书
Python Django ORM连表正反操作技巧
2021/06/13 Python
SQL SERVER中的流程控制语句
2022/05/25 SQL Server