0

我有一个已经打开的文件,我想自动关闭它。是否有任何现有方法可以将文件包装在with语句中?

4

3 回答 3

10

在 Python 3 中测试:

>>> f = open('test.txt', 'w')
>>> with f:
...    f.closed
...    f.write('a')


False
1
>>> f.closed
True

所以是的,你可以。但是,它不会重新打开已经关闭的文件:

>>> f.closed
True
>>> with f:
...    f.write('a')


Traceback (most recent call last):
  File "<pyshell#10>", line 1, in <module>
    with f:
ValueError: I/O operation on closed file.

其原因可能是上下文管理器只是可以与with语句一起使用的对象。语句中的as <identifier>with为提供给语句的对象提供别名,with以便您可以在with语句本身中创建对象,而不必将变量声明放在另一行:

>>> f = open('test.txt', 'w')
>>> with f as ff:
...    ff.closed


False

这使得在同一个对象上多次使用语句变得很容易with(例如,如果对象被设置为它__enter__(重新)启动一个连接,同时它__exit__关闭连接同时允许它被重新打开),这可能非常有用数据库事务等。

于 2013-08-08T19:50:53.223 回答
4

这工作正常:

f = open('file')
with f:
    print >> f, "Open"

print f.closed  # True

但这会失败,因为file.__enter__它的行为不像递归互斥锁:

f = open('file')

with f:
    print >> f, "Open"
    with f:
        print >> f, "Open"
    print >> f, "This errors, as the file is already closed"
于 2013-08-08T20:00:35.973 回答
2

这样的事情应该可以解决问题:

from contextlib import contextmanager

@contextmanager
def close_file(f):
    yield
    f.close()

with close_file(my_file):
    blabla()
于 2013-08-08T19:49:44.267 回答