python with statement 进行文件操作指南

由于之前有一个项目老是要打开文件,然后用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真是有很多很优雅的好特性,路漫漫其修远兮,吾将上下而求索。。。

(0)

相关推荐

  • Python中的with...as用法介绍

    这个语法是用来代替传统的try...finally语法的. 复制代码 代码如下: with EXPRESSION [ as VARIABLE] WITH-BLOCK 基本思想是with所求值的对象必须有一个__enter__()方法,一个__exit__()方法. 紧跟with后面的语句被求值后,返回对象的__enter__()方法被调用,这个方法的返回值将被赋值给as后面的变量.当with后面的代码块全部被执行完之后,将调用前面返回对象的__exit__()方法. 复制代码 代码如下: fil

  • Python 的 with 语句详解

    一.简介 with是从Python 2.5 引入的一个新的语法,更准确的说,是一种上下文的管理协议,用于简化try-except-finally的处理流程.with通过__enter__方法初始化,然后在__exit__中做善后以及处理异常.对于一些需要预先设置,事后要清理的一些任务,with提供了一种非常方便的表达. with的基本语法如下,EXPR是一个任意表达式,VAR是一个单一的变量(可以是tuple),"as VAR"是可选的. 复制代码 代码如下: with EXPR as

  • 合并百度影音的离线数据( with python 2.3)

    四种格式的解析: filelist slicelist download.cfg third_party_download.cfg 还是2个文件.替换之前版本即可. 初步测试正常,但时间轴不对. 代码如下: # -*- coding: UTF-8 -*- import os import io import codecs import string import shutil import moviefmt import traceback def coroutine(func): def st

  • 在Python中操作字符串之startswith()方法的使用

    startswith()方法检查字符串是否以str开始,任选限制匹配与给定索引的开始和结束. 语法 以下是startswith()方法的语法: str.startswith(str, beg=0,end=len(string)); 参数 str -- 这是要检查的字符串. beg -- 这是可选的参数设置匹配边界的初始索引. end -- 这是可选的参数设置匹配边界的结束索引. 返回值 如果找到匹配的字符串此方法返回true,否则为false. 例子 下面的例子显示了startswith()方法

  • Python with的用法

    在Python中,with关键字是一个替你管理实现上下文协议对象的好东西.例如:file等.示例如下: from __future__ import with_statement with open('cardlog.txt','r') as item : for line in item : print line; 在file的结束,会自动关闭该文件句柄.   在python2.6中,with正式成为了关键字 所以在python2.5以前,要利用with的话,需要使用: from __futu

  • Python中的startswith和endswith函数使用实例

    在Python中有两个函数分别是startswith()函数与endswith()函数,功能都十分相似,startswith()函数判断文本是否以某个字符开始,endswith()函数判断文本是否以某个字符结束. startswith()函数 此函数判断一个文本是否以某个或几个字符开始,结果以True或者False返回. 复制代码 代码如下: text='welcome to qttc blog' print text.startswith('w')      # True print text

  • python自动化测试之从命令行运行测试用例with verbosity

    本文实例讲述了python自动化测试之从命令行运行测试用例with verbosity,分享给大家供大家参考.具体如下: 实例文件recipe3.py如下: class RomanNumeralConverter(object): def __init__(self, roman_numeral): self.roman_numeral = roman_numeral self.digit_map = {"M":1000, "D":500, "C"

  • Python ValueError: invalid literal for int() with base 10 实用解决方法

    今天在写爬虫程序的时候由于要翻页,做除法分页的时候出现了 复制代码 代码如下: totalCount = '100' totalPage = int(totalCount)/20 ValueError: invalid literal for int() with base 10的错误 网上同样的错误有人建议用round(float("1.0″)),但是解决不了我这个问题,round(float("1.0″))是用于解决浮点数转换为整形数的, 而我这个则是因为原字符串转换为整形后做除法

  • python with statement 进行文件操作指南

    由于之前有一个项目老是要打开文件,然后用pickle.load(file),再处理...最后要关闭文件,所以觉得有点繁琐,代码也不简洁.所以向python with statement寻求解决方法. 在网上看到一篇文章:http://effbot.org/zone/python-with-statement.htm是介绍with 的,参考着例子进行了理解. 如果经常有这么一些代码段的话,可以用一下几种方法改进: 代码段: set thing up try: do something except

  • Python打包成exe文件的详细操作指南

    目录 前言 一.安装pyinstaller 1.1 安装pyinstaller,使用安装命令: 1.2 如果遇到需要更新版本请输入: 1.3 检查是否正确安装 1.4 稍等,水一下; 二.python打包成exe文件(附带图标打包) 2.1 第一种:cd到指定文件夹打包存放 2.2 第二种方法:cd到py源文件夹内打包存放 2.3最终效果 参考:命令解释 总结 前言 我原本是学C\C++,这是本人第一篇关于python的文章.请多多关照! 对于python为什么要打包成exe文件,是因为传输源文

  • Python读取和处理文件后缀为.sqlite的数据文件(实例讲解)

    最近在弄一个项目分析的时候,看到有一个后缀为".sqlite"的数据文件,由于以前没怎么接触过,就想着怎么用python来打开并进行数据分析与处理,于是稍微研究了一下. SQLite是一款非常流行的关系型数据库,由于它非常轻盈,因此被大量应用程序采用. 像csv文件一样,SQLite可以将数据存储于单个数据文件,以便方便的分享给其他人员.许多编程语言都支持SQLite数据的处理,python语言也不例外. sqlite3是python的一个标准库,可以用于处理SQLite数据库. 用s

  • Python实现读取TXT文件数据并存进内置数据库SQLite3的方法

    本文实例讲述了Python实现读取TXT文件数据并存进内置数据库SQLite3的方法.分享给大家供大家参考,具体如下: 当TXT文件太大,计算机内存不够时,我们可以选择按行读取TXT文件,并将其存储进Python内置轻量级splite数据库,这样可以加快数据的读取速度,当我们需要重复读取数据时,这样的速度加快所带来的时间节省是非常可观的,比如,当我们在训练数据时,要迭代10万次,即要从文件中读取10万次,即使每次只加快0.1秒,那么也能节省几个小时的时间了. #创建数据库并把txt文件的数据存进

  • python保存字符串到文件的方法

    本文实例讲述了python保存字符串到文件的方法.分享给大家供大家参考.具体实现方法如下: def save(filename, contents): fh = open(filename, 'w') fh.write(contents) fh.close() save('file.name', 'some stuff') 希望本文所述对大家的Python程序设计有所帮助.

  • Python实现基于HTTP文件传输实例

    本文实例讲述了Python实现基于HTTP文件传输的方法.分享给大家供大家参考.具体实现方法如下: 一.问题: 因为需要最近看了一下通过POST请求传输文件的内容 并且自己写了Server和Client实现了一个简单的机遇HTTP的文件传输工具 二.实现代码: Server端: 复制代码 代码如下: #coding=utf-8 from BaseHTTPServer import BaseHTTPRequestHandler import cgi class   PostHandler(Base

  • Python实现将一个大文件按段落分隔为多个小文件的简单操作方法

    本文实例讲述了Python实现将一个大文件按段落分隔为多个小文件的简单操作方法.分享给大家供大家参考,具体如下: 今天帮同学处理一点语料.语料文件有点大,并且是以连续两个换行符作为段落标志,他想把它按段落分隔成多个小文件,即每3个段落组成一个新文件.由于以前没有遇到过类似的操作,在网上找了一些相似的方法,看起来都有点复杂.所以经尝试,自己写了一段代码,完美解决问题. 基本思路是,先读原文件内容,并使用正则表达式,依据\n\n进行切片处理,结果为一个列表,其中每一个列表元素都存放一个切片中的内容;

  • Python脚本实时处理log文件的方法

    这个Python脚本是用来对实时文件的内容监控,比如 Error 或者 time out 字段都可以进行自定义:算是我的第一个真正的Python脚本,自己感觉还是比较臃肿,不过打算放到blog上记录一下(还是初学者,大神们勿喷哈),真心希望博友们能够再指点一下(现在记录每次的文件大小值是输出到了一个文件中,并且里面还嵌套了有shell命令,这些我认为都是可以优化掉的吧,只是现在我还不知道怎么做):告警是基于zabbix,自定义的模板是120s执行一次 #!/usr/local/bin/pytho

  • python自动格式化json文件的方法

    本文实例讲述了python自动格式化json文件的方法.分享给大家供大家参考.具体如下: 这里主要实现将代码混乱的json文件格式化. 还有一小堆python常用算法代码 完整实例代码点击此处本站下载. class JsonFormatter: def __init__(self,intend=4,name=""): self.name=name self.intend=intend self.stack=[] self.obj=None self.source=self.get_so

  • python 自动化将markdown文件转成html文件的方法

    一.背景 我们项目开发人员写的文档都是markdown文件.对于其它组的同学要进行阅读不是很方便.每次编辑完markdown文件,我都是用软件将md文件转成html文件.刚开始转的时候,还没啥,转得次数多了,就觉得不能继续这样下去了.作为一名开发人员,还是让机器去做这些琐碎的事情吧.故写了两个脚本将md文件转成html文件,并将其放置在web服务器下,方便其他人员阅读. 主要有两个脚本和一个定时任务: •一个python脚本,主要将md文件转成html文件: •一个shell脚本,主要用于管理逻

随机推荐