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引用DLL文件的方法
May 11 Python
用 Python 爬了爬自己的微信朋友(实例讲解)
Aug 25 Python
Python运行不显示DOS窗口的解决方法
Oct 22 Python
python爬取指定微信公众号文章
Dec 20 Python
Python 3.x基于Xml数据的Http请求方法
Dec 28 Python
django将网络中的图片,保存成model中的ImageField的实例
Aug 07 Python
python3.7实现云之讯、聚合短信平台的短信发送功能
Sep 26 Python
win10安装tensorflow-gpu1.8.0详细完整步骤
Jan 20 Python
python数据库编程 Mysql实现通讯录
Mar 27 Python
keras 多gpu并行运行案例
Jun 10 Python
Pytest实现setup和teardown的详细使用详解
Apr 17 Python
Python中Numpy和Matplotlib的基本使用指南
Nov 02 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
Cannot modify header information错误解决方法
2008/10/08 PHP
Php Ctemplate引擎开发相关内容
2012/03/03 PHP
php增删改查示例自己写的demo
2013/09/04 PHP
分析 JavaScript 中令人困惑的变量赋值
2007/08/13 Javascript
兼容多浏览器的iframe自适应高度(ie8 、谷歌浏览器4.0和 firefox3.5.3)
2009/11/04 Javascript
input 输入框内的输入事件详细分析
2010/03/17 Javascript
JavaScript 异步方法队列链实现代码分析
2010/06/05 Javascript
JS保留小数点(四舍五入、四舍六入)实现思路及实例
2013/04/25 Javascript
Jquery获取元素的父容器对象示例代码
2014/02/10 Javascript
jQuery日历插件datepicker用法详解
2016/03/03 Javascript
H5移动端图片压缩上传开发流程
2016/11/09 Javascript
bootstrap中的 form表单属性role="form"的作用详解
2017/01/20 Javascript
angularJs使用$watch和$filter过滤器制作搜索筛选实例
2017/06/01 Javascript
vue实现全选、反选功能
2020/11/17 Javascript
Nodejs中的require函数的具体使用方法
2019/04/02 NodeJs
koa-router路由参数和前端路由的结合详解
2019/05/19 Javascript
Node.js HTTP服务器中的文件、图片上传的方法
2019/09/23 Javascript
js+html实现点名系统功能
2019/11/05 Javascript
详解element-ui动态限定的日期范围选择器代码片段
2020/07/03 Javascript
前端vue+elementUI如何实现记住密码功能
2020/09/20 Javascript
python实现清屏的方法
2015/04/30 Python
Python 爬虫多线程详解及实例代码
2016/10/08 Python
Python闭包之返回函数的函数用法示例
2018/01/27 Python
Linux下多个Python版本安装教程
2018/08/15 Python
python leetcode 字符串相乘实例详解
2018/09/03 Python
TensorFlow索引与切片的实现方法
2019/11/20 Python
意大利专业化妆品品牌:KIKO MILANO
2017/02/01 全球购物
瑞典香水、须后水和美容产品购物网站:Parfym-Klick.se
2019/12/29 全球购物
俄罗斯游戏商店:Buka
2020/03/01 全球购物
应用艺术毕业生的自我评价
2013/12/04 职场文书
期末评语大全
2014/05/04 职场文书
2014年幼儿园国庆主题活动方案
2014/09/16 职场文书
初二学生评语大全
2014/12/26 职场文书
参加招聘会后的感想
2015/08/10 职场文书
写好求职信的技巧解密
2019/05/14 职场文书
Java数组与堆栈相关知识总结
2021/06/29 Java/Android