在内联“打开并写入文件”中,close()是隐含的吗?

15

在Python (>2.7)中,下面这段代码:

open('tick.001', 'w').write('test')

与以下代码具有相同的结果:

ftest  = open('tick.001', 'w')
ftest.write('test')
ftest.close()

还有哪些文档可以找到关于这个内联功能的“close”方法的信息?

1个回答

25

close()在这里发生的时候,是在file对象从内存中释放时作为其删除逻辑的一部分。因为现代Python在其他虚拟机上(如Java和.NET)不能控制对象何时从内存中释放,所以不再被认为是好的Python做法,没有close()就使用open()。今天的建议是使用with语句,在退出块时显式请求close()

with open('myfile') as f:
    # use the file
# when you get back out to this level of code, the file is closed
如果您不需要文件的名称f,那么可以从语句中省略as从句:

如果你不需要一个名字f来命名文件,那么你可以在语句中省略as从句:

with open('myfile'):
    # use the file
# when you get back out to this level of code, the file is closed

能否在不使用临时变量 f 的情况下进行内联操作? - kirill_igum
是的,我已经补充了问题以展示如何不为文件创建名称“f”。 - Brandon Rhodes
@kirill_igum,也许我不够有创意,但是你会打开一个文件而不需要句柄来读/写它的应用程序是什么类型的? - Chris
1
@Chris — 我可以想象一个脚本想要创建一个 .git/index.lock 文件来告诉其他应用程序不要干扰。它可以使用模式 'x' 打开,以强制失败,如果文件已经存在的话。 - Brandon Rhodes
@IsaacRabinovitch — 我不知道有任何文档。标准库文档只描述了with语句或显式的close,没有提到当对象被释放时隐式关闭的情况。https://docs.python.org/3/tutorial/inputoutput.html#reading-and-writing-files - Brandon Rhodes
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接