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

时间:2015-01-23 17:35:47

标签: python-3.x

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版

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

我尝试了这个快捷方式,因为它看起来是一回事,除非没有为函数赋值。我认为只是接受这样一个事实,即一切都必须以某种方式完成,但我的好奇心是压倒性的。

1 个答案:

答案 0 :(得分:3)

您遇到第二个示例问题的原因是

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

产生错误。这意味着两者打开返回文件类对象,这些对象彼此无关。当你

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()括号。