Python 打开文件、写入文件而不关闭文件是否安全?
我有一个相当大的Python(3)脚本,我正在尝试优化它。Python 打开文件、写入文件而不关闭文件是否安全?,python,file,python-3.x,Python,File,Python 3.x,我有一个相当大的Python(3)脚本,我正在尝试优化它。 据我所知,当您使用带有open(…,…)的作为x时,您不需要在“with”块的末尾使用.close()(它是自动关闭的)。 我还知道,在操作完文件后,应该添加.close()(如果您没有将用于),如下所示: f = open(..., ...) f.write() f.close() open(location, mode).write(content) 为了将3行(以上)挤成1行,我尝试改变这一点: with open(locat
据我所知,当您使用带有open(…,…)的
作为x时,您不需要在“with”块的末尾使用.close()
(它是自动关闭的)。
我还知道,在操作完文件后,应该添加.close()
(如果您没有将用于),如下所示:
f = open(..., ...)
f.write()
f.close()
open(location, mode).write(content)
为了将3行(以上)挤成1行,我尝试改变这一点:
with open(location, mode) as packageFile:
packageFile.write()
为此:
open(location, mode).write(content).close()
不幸的是,这不起作用,我得到了以下错误:
Traceback (most recent call last):
File "test.py", line 20, in <module>
one.save("one.txt", sample)
File "/home/nwp/Desktop/Python/test/src/one.py", line 303, in save
open(location, mode).write(content).close()
AttributeError: 'int' object has no attribute 'close'
为什么没有打开(位置、模式).write(内容).close()
工作,省略.close()
功能是否安全
我还知道,在操作完文件后,应该添加.close()
如果将与
一起使用,则不会
为什么不打开(位置、模式)。写入(内容)。关闭()
工作
因为您没有尝试关闭文件,而是尝试关闭write
方法调用的返回值,它是一个整数。不能关闭整数
省略.close()
函数是否安全
不会。如果您在不同的Python实现上运行此代码,或者如果CPython放弃引用计数,您的写入可能会被任意延迟,甚至完全丢失
如果你真的想把它塞进一行,你可以用
语句写一行
:
with open(location, mode) as packageFile: packageFile.write(whatever)
这是不鼓励的,但比依赖文件对象的终结器来为您关闭文件更不鼓励。这是因为
(点)操作符从左到右工作。在a.b
中,b
是传递给a
的消息(方法调用)。说
a.b.c...
阅读
现在open
返回一个响应read
消息的对象,但是read
返回一个str
/字节
没有方法close
Bdw,始终在此类上下文中使用上下文管理器,即使用和
。我想知道这和优化有什么关系,就像你说的,你在优化脚本的时候这么做 在我看来,我们的目标是让一个函数一个接一个地出现,但这并不是现在发生的事情
打开(位置、模式)返回一个文件:
语法为
open(location, mode).write(content)
这实际上相当于
file = open(location, mode)
file.write(content)
open语句将成为一个类型文件,其中包含一个名为write()的函数。.close()不起作用的原因是文件.write()没有名为close()的函数。这试图做的是file.function().function()
在任何情况下,试图通过减少行数来优化代码都不会显著提高性能,normal with语句应该同样快。除非你想打代码高尔夫,这是一门完全不同的学科
祝你有愉快的一天
省略.close()函数是否安全
在当前版本的CPython中,该文件将在for循环结束时关闭,因为CPython使用引用计数作为其主要垃圾收集机制,但这是一个实现细节,而不是该语言的一个特性
还直接引用:如果您在不同的Python实现上运行此代码,或者如果CPython放弃引用计数,您的写入可能会被任意延迟,甚至完全丢失。
为什么没有打开(位置、模式).write(内容).close()工作
这是因为我试图在返回打开(位置、模式)时调用.close()
方法。写入(内容)
@Tommy:不同的Python版本。OP标记为“Python”和“python3”,并且在问题中没有指定任何地方,因此这应该更通用,或者应该为将来的用户编辑问题,也许。@托米:我会考虑Python 3标签来指定它们在Python 3上,错误消息明确地说他们试图关闭一个整数。在任何情况下,如果您使用的是Python 2,并且最终尝试关闭None
,那么答案并没有根本的不同。在您回答之前,我花了很多时间试图找出错误消息的来源,因为我无法复制它,直到您说他们使用的是Python 3,我才意识到这一点。第一个标签是python。谢谢你的回答。你知道你可以用“``引用你的内联代码吗,比如file.write()
?OP还询问省略close()
是否安全。不能通过将多行“挤”在一起来“优化”脚本。最终,您所要做的就是影响可读性,可能会引入类似这样的错误,并使脚本更难维护。程序应该被人阅读,就像被机器阅读一样,而且它们需要维护,而不是总是由原始作者来维护。当你试图把东西塞进一堆的时候,它只会让一切变得更加困难。当然,方法链接有时是有用的,因为它可以防止创建可能昂贵的临时变量,但从长远来看并不总是值得的。
file = open(location, mode)
file.write(content)