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 logging
Apr 15 Python
Python 迭代器工具包【推荐】
May 06 Python
Python进阶篇之字典操作总结
Nov 16 Python
python fabric实现远程部署
Jan 05 Python
python解析基于xml格式的日志文件
Feb 25 Python
python深度优先搜索和广度优先搜索
Feb 07 Python
Python3.7中安装openCV库的方法
Jul 11 Python
Python autoescape标签用法解析
Jan 17 Python
Python编程快速上手——正则表达式查找功能案例分析
Feb 28 Python
pyinstaller打包找不到文件的问题解决
Apr 15 Python
利用python制作拼图小游戏的全过程
Dec 04 Python
Sentry的安装、配置、使用教程(Sentry日志手机系统)
Jul 23 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
桌面中心(一)创建数据库
2006/10/09 PHP
php面向对象全攻略 (十二) 抽象方法和抽象类
2009/09/30 PHP
php实现批量压缩图片文件大小的脚本
2014/07/04 PHP
PHP图片处理之图片背景、画布操作
2014/11/19 PHP
Thinkphp无限级分类代码
2015/11/11 PHP
PHP实现路由映射到指定控制器
2016/08/13 PHP
JS 页面自动加载函数(兼容多浏览器)
2009/05/18 Javascript
JS+CSS实现经典的左侧竖向滑动菜单效果
2015/09/23 Javascript
jQuery随手笔记之常用的jQuery操作DOM事件
2015/11/29 Javascript
轻松学习jQuery插件EasyUI EasyUI创建RSS Feed阅读器
2015/11/30 Javascript
AngularJS 使用$sce控制代码安全检查
2016/01/05 Javascript
JS不用正则验证输入的字符串是否为空(包含空格)的实现代码
2016/06/14 Javascript
简单实现的JQuery文本框水印插件
2016/06/14 Javascript
AngularJS实现使用路由切换视图的方法
2017/01/24 Javascript
AngularJS 控制器 controller的详解
2017/10/17 Javascript
bootstrap日期插件daterangepicker使用详解
2017/10/19 Javascript
vue移动端弹框组件的实例
2018/09/25 Javascript
layui实现数据表格自定义数据项
2019/10/26 Javascript
微信小程序的引导页实现代码
2020/06/24 Javascript
浅谈vue使用axios的回调函数中this不指向vue实例,为undefined
2020/09/21 Javascript
在Vue中使用CSS3实现内容无缝滚动的示例代码
2020/11/27 Vue.js
[53:10]完美世界DOTA2联赛决赛日 FTD vs GXR 第二场 11.08
2020/11/11 DOTA
python中numpy基础学习及进行数组和矢量计算
2017/02/12 Python
python实现kNN算法
2017/12/20 Python
Python实现图片转字符画的代码实例
2019/02/22 Python
PyQt5创建一个新窗口的实例
2019/06/20 Python
tensorflow 利用expand_dims和squeeze扩展和压缩tensor维度方式
2020/02/07 Python
详解python定时简单爬取网页新闻存入数据库并发送邮件
2020/11/27 Python
HTML5通用接口详解
2016/06/12 HTML / CSS
抄作业检讨书
2014/02/17 职场文书
《盘古开天地》教学反思
2014/02/28 职场文书
项目采购员岗位职责
2014/04/15 职场文书
幼儿园评语大全
2014/04/17 职场文书
2014小学语文教学工作总结
2014/12/17 职场文书
毕业生捐书活动倡议书
2015/04/27 职场文书
CSS极坐标的实例代码
2021/06/03 HTML / CSS