Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 打开文件、写入文件而不关闭文件是否安全?_Python_File_Python 3.x - Fatal编程技术网

Python 打开文件、写入文件而不关闭文件是否安全?

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

我有一个相当大的Python(3)脚本,我正在尝试优化它。
据我所知,当您使用带有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)