打开(文件) - 它是否保持打开状态?

时间:2012-10-03 06:48:56

标签: python file

我正在学习如何使用open(file, 'r')并且想知道:

如果我说open(file1, 'r')然后再尝试使用open()再次访问该文件,它会有效吗?因为我从未做过close()。它是否会在打开后立即关闭,因为它没有分配给任何变量?

3 个答案:

答案 0 :(得分:6)

在cpython中,如果使用open()而未将结果分配给变量,则会立即再次关闭该文件。在其他python实现(IronPython,jython等)上可能并非如此;如果未明确关闭,则在被垃圾收集器删除时,文件对象将被关闭。

您可以多次打开文件,因此您可以随时将相同的文件名再次传递给open(),文件是否打开。

通常最好使用开放文件作为上下文管理器,使用with语句。当完成with语句下缩进的代码块时,文件会自动关闭:

with open(filename, 'r') as f:
    # Do things with f

# f is automatically closed

答案 1 :(得分:1)

文件将保持打开状态,直到您关闭它,否则Python进程将停止。您可以再次打开它,但是在完成后应该关闭它。

执行此操作的最佳方法是使用open作为with语句上下文管理器:

with open("file", 'r') as f:
    # do stuff

一旦代码离开with块,文件就会自动关闭。实际上,它甚至比这更好,因为即使代码通过引发异常而离开块,文件也会被关闭。当然,您也可以使用file.close()关闭文件。

如果您知道文件不会太大,并且您想要做的就是阅读它,一个常见的习惯用法就是将整个文件加载到内存中,然后您就可以忘记文件句柄了。例如:

with open("file", 'r') as f:
    text = f.read()

要查看文件是否存在,请使用os.path.exists

import os
os.path.exists("file")

答案 2 :(得分:1)

我不知道我是否理解你,但使用open()可以创建表示文件流的对象。在您继续引用此对象之前,将打开文件流。但是如果再次为同一个文件调用open(),则会创建另一个表示文件流的对象。流的目标将是相同的,但对象将是不同的。

我不知道垃圾收集器如何在python中与java中相同,但如果确实如此,那么任何引用都没有指向的所有对象都将从内存中删除。不是“立即”但是当垃圾收集器运行时,这是不可预测的。现在可能是,现在可能会在接下来的几秒钟内完成。