1

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

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

4

3 回答 3

6

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

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

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

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

# f is automatically closed
于 2012-10-03T06:54:50.960 回答
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")
于 2012-10-03T06:55:36.023 回答
1

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

i don't know how if garbage collector works in python the same as in java, but if it does, all the objects that are not pointed by any reference will be deleted from memory. not "immediately" but when garbage collector will run, and this is unpredictable. it may be now, and it may be in next few seconds.

于 2012-10-03T07:01:17.763 回答