zl程序教程

您现在的位置是:首页 >  其他

当前栏目

pythonwithstatement进行文件操作指南

文件 指南 操作 进行
2023-06-13 09:15:44 时间

由于之前有一个项目老是要打开文件,然后用pickle.load(file),再处理。。。最后要关闭文件,所以觉得有点繁琐,代码也不简洁。所以向pythonwithstatement寻求解决方法。

在网上看到一篇文章:http://effbot.org/zone/python-with-statement.htm是介绍with的,参考着例子进行了理解。

如果经常有这么一些代码段的话,可以用一下几种方法改进:

代码段:

setthingup
try:
dosomething
except:
handleexception
finally:
tearthingdown

案例1:

假如现在要实现这么一个功能,就是打开文件,从文件里面读取数据,然后打印到终端,之后关闭文件。

那么从逻辑上来说,可以抽取“打印到终端”为数据处理部分,应该可以独立开来作为一个函数。其他像打开、关闭文件应该是一起的。

文件名为:for_test.txt

方法1:

用函数,把公共的部分抽取出来。
 

#!/usr/bin/envpython
from__future__importwith_statement
filename="for_test.txt"
defoutput(content):
printcontent
#functiosolution
defcontrolled_execution(func):
#preparething
f=None
try:
#setthingup
f=open(filename,"r")
content=f.read()
ifnotcallable(func):
return
#dealwiththing
func(content)
exceptIOError,e:
print"Error%s"%str(e)
finally:
iff:
#tearthingdown
f.close()
deftest():
controlled_execution(output)
test()

 
方法2:

用yield实现一个只产生一项的generator。通过for-in来循环。

代码片段如下:

#yieldsolution
defcontrolled_execution():
f=None
try:
f=open(filename,"r")
thing=f.read()
#forthinginf:
yieldthing
exceptIOError,e:
print"Error%s"%str(e)
finally:
iff:
f.close()
deftest2():
forcontentincontrolled_execution():
output(content)

 

方法3:

用类的方式加上with实现。

代码片段如下:
 

#classsolution
classcontrolled_execution(object):
def__init__(self):
self.f=None
def__enter__(self):
try:
f=open(filename,"r")
content=f.read()
returncontent
exceptIOError,e:
print"Error%s"%str(e)
#returnNone
def__exit__(self,type,value,traceback):
ifself.f:
print"type:%s,value:%s,traceback:%s"%\
(str(type),str(value),str(traceback))
self.f.close()
deftest3():
withcontrolled_execution()asthing:
ifthing:
output(thing)

方法4:

用with实现。不过没有exceptionhandle的功能。

deftest4():
withopen(filename,"r")asf:
output(f.read())

printf.read()

 最后一句print是用来测试f是否已经被关闭了。

   最后总结一下,写这篇文章的目的主要是受了一句话的刺激:“使用语言的好特性,不要使用那些糟糕的特性”!python真是有很多很优雅的好特性,路漫漫其修远兮,吾将上下而求索。。。