用Python打开文件和语句

时间:2013-05-13 01:08:49

标签: python

我的功能如下:

def func(filename):
    with open(filename) as f:
        return [line.split('\t')[0] for line in f]

即使有“突然”函数返回,“with”语句是否会关闭文件?我可以忽略“with”语句吗?即从安全性和等效性(从内存泄漏的角度来看)来做,

def func(filename):
    return [line.split('\t')[0] for line in open(filename)]

2 个答案:

答案 0 :(得分:4)

这很安全。即使您在上下文中__exit__,也会调用上下文管理器return,因此文件句柄已正确关闭。

这是一个简单的测试:

class ContextTest(object):
    def __enter__(self):
        print('Enter')

    def __exit__(self, type, value, traceback):
        print('Exit')

def test():
    with ContextTest() as foo:
        print('Inside')
        return

当你致电test()时,你会得到:

Enter
Inside
Exit

答案 1 :(得分:0)

保证这种安全实际上是with...as...语法的全部目的;它取代了try / finally块,否则这些块会相当尴尬。所以,是的,它保证是安全的,这就是为什么我更喜欢with open as ff = open

有关语法存在的原因及其工作原理的详细说明,请参阅http://effbot.org/zone/python-with-statement.htm。请注意,您可以使用__enter____exit__方法编写自己的类,以真正利用此语法。

另请参阅PEP了解此功能:http://www.python.org/dev/peps/pep-0343/