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版
没有错误,但文本文件为空..
我尝试了这个快捷方式,因为它看起来是一回事,除非没有为函数赋值。我认为只是接受这样一个事实,即一切都必须以某种方式完成,但我的好奇心是压倒性的。
答案 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()
括号。