python with statement 进行文件操作指南

作者:hebedich 时间:2022-02-11 08:50:38 

由于之前有一个项目老是要打开文件,然后用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,with
0
投稿

猜你喜欢

  • FckEditor 配置手册中文教程详细说明

    2023-06-18 20:35:59
  • JavaScript的Number对象的toString()方法

    2024-04-18 10:08:55
  • Python读取JSON数据操作实例解析

    2021-08-11 18:27:34
  • Anaconda最新版2023安装教程Spyder安装教程图文详解

    2021-12-24 00:29:56
  • Asp编写不再让人讨厌的自动弹出窗口

    2007-09-29 12:16:00
  • PHP生成HTML静态页面实例代码

    2023-10-28 12:05:01
  • 跟老齐学Python之有容乃大的list(1)

    2021-08-17 00:27:09
  • 如何利用python正确地为图像添加高斯噪声

    2023-08-03 08:26:22
  • Python数据可视化之matplotlib.pyplot绘图的基本参数详解

    2022-06-10 12:19:48
  • 实例讲解MySQL 慢查询

    2024-01-20 16:25:56
  • Python机器学习之SVM支持向量机

    2023-07-18 06:39:24
  • C#自动创建数据库实现代码

    2024-01-17 14:18:03
  • 七种Python代码审查工具推荐

    2021-06-16 07:07:34
  • layer页面跳转,获取html子节点元素的值方法

    2024-04-29 13:43:15
  • PyCharm 设置数据库,查询数据库语句方式

    2024-01-19 22:05:07
  • 给Notepad++换主题

    2009-05-04 14:43:00
  • 解析:Perl下应当如何连接Access数据库

    2008-11-28 16:40:00
  • Perl中的文件读写学习笔记

    2022-07-10 09:13:55
  • python通过paramiko复制远程文件及文件目录到本地

    2023-02-07 06:03:28
  • PHP与MySQL开发中页面乱码的产生与解决

    2023-10-03 04:10:08
  • asp之家 网络编程 m.aspxhome.com