为什么我们需要在变量中保存一个文件对象?

Why do we need to hold a file object inside a variable?

url = 'learn.txt'

variable1 = open(url, 'w')

writethis = variable1.write('Oh hey!')

writethis

variable1.close

好的,如果可行,那为什么不行:

url = 'learn.txt'

open(url, 'w').write('Oh hey!')

open(url, 'w').close

我正在使用 Python 版本 3.4.2

没有错误,但文本文件为空..

我尝试了这个快捷方式,因为它看起来是一样的,只是没有为函数分配变量。我考虑过接受一切都必须以某种方式完成的事实,但我的好奇心是压倒性的。

第二个例子有问题的原因是

x = open(url, "w")
y = open(url, "w")
x is y

产生错误。这意味着两者打开了return个没有任何关系的类文件对象。当你

open(url, 'w').write('Oh hey!')

这实际上没问题,在 正常 退出时,打开的文件将被刷新并关闭。接下来是

open(url, 'w').close()

首先无法关闭第一个示例行中的文件对象,其次以 'w' 模式打开现有文件将首先将其截断为零长度。该片段将落在末尾,刷新并关闭每个文件对象,但基础文件 (url) 已被截断为零长度。

你的第一个例子是正确的,比第二个更常见;正如您所注意到的,第二个是致命的缺陷。更惯用也更安全的是:

with open(url, 'w') as out_file:
    outfile.write('Oh hey!\n')
    # other stuff you might want to write to out_file

上下文管理器 (with) 确保 out_file 被刷新和关闭,即使在其主体中引发异常也是如此。


此答案基于以下假设:您调用 close 时有错别字,实际上应该 .close() 加括号。