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中的魔法方法深入理解
Jul 09 Python
Python max内置函数详细介绍
Nov 17 Python
python中执行shell的两种方法总结
Jan 10 Python
Python制作豆瓣图片的爬虫
Dec 28 Python
python 中if else 语句的作用及示例代码
Mar 05 Python
关于Django ForeignKey 反向查询中filter和_set的效率对比详解
Dec 15 Python
基于python生成器封装的协程类
Mar 20 Python
Python数据类型之Tuple元组实例详解
May 08 Python
机器学习实战之knn算法pandas
Jun 22 Python
Python爬虫回测股票的实例讲解
Jan 22 Python
使用Python下载抖音各大V视频的思路详解
Feb 06 Python
彻底解决pip下载pytorch慢的问题方法
Mar 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
漂亮但不安全的CTB
2006/10/09 PHP
MYSQL 小技巧 -- LAST_INSERT_ID
2009/11/24 PHP
PHP中将字符串转化为整数(int) intval() printf() 性能测试
2020/03/20 PHP
smarty半小时快速上手入门教程
2014/10/27 PHP
分享十款最出色的PHP安全开发库中文详细介绍
2015/03/22 PHP
利用switch语句进行多选一判断的实例代码
2016/11/14 PHP
理解JavaScript中的对象 推荐
2011/01/09 Javascript
JS操作图片(增,删,改) 例子
2013/04/17 Javascript
window.navigate 与 window.location.href 的使用区别介绍
2013/09/21 Javascript
JavaScript中的undefined学习总结
2013/11/30 Javascript
javascript使用百度地图api和html5特性获取浏览器位置
2014/01/10 Javascript
javascript制作2048游戏
2015/03/30 Javascript
jQuery简单实现图片预加载
2015/04/20 Javascript
JavaScript合并两个数组并去除重复项的方法
2015/06/13 Javascript
在Python中使用glob模块查找文件路径的方法
2015/06/17 Javascript
JavaScript制作简单的日历效果
2016/03/10 Javascript
Bootstrap table简单使用总结
2017/02/15 Javascript
JS获取当前地理位置的方法
2017/10/25 Javascript
node.js 如何监视文件变化
2020/09/01 Javascript
JavaScript实现网页计算器功能
2020/10/29 Javascript
[55:25]VGJ.T vs Optic Supermajor小组赛D组 BO3 第三场 6.3
2018/06/04 DOTA
python中readline判断文件读取结束的方法
2014/11/08 Python
Python的GUI框架PySide的安装配置教程
2016/02/16 Python
Python使用gensim计算文档相似性
2016/04/10 Python
python操作xlsx文件的包openpyxl实例
2018/05/03 Python
Python pandas 列转行操作详解(类似hive中explode方法)
2020/05/18 Python
python如何获得list或numpy数组中最大元素对应的索引
2020/11/16 Python
CSS3实现头像旋转效果
2017/03/13 HTML / CSS
美国创意礼品网站:UncommonGoods
2017/02/03 全球购物
Otticanet意大利:最顶尖的世界名牌眼镜, 能得到打折季的价格
2019/03/10 全球购物
北大研究生linux应用求职信
2013/10/29 职场文书
高中化学教学反思
2014/01/13 职场文书
《彩色世界》教学反思
2014/04/12 职场文书
教师个人自我评价范文
2014/04/13 职场文书
2014年维修工作总结
2014/11/22 职场文书
mysql 索引的数据结构为什么要采用B+树
2022/04/26 MySQL