我有一个已经打开的文件,我想自动关闭它。是否有任何现有方法可以将文件包装在with
语句中?
问问题
98 次
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 回答