您询问了“基本概念”,因此让我们从头开始:打开文件时,您的程序可以访问系统资源,即程序自身内存空间之外的内容。 基本上,这是操作系统(Unix术语中的系统调用)所提供的一些魔术。 隐藏在文件对象内部的是对“文件描述符”的引用,“文件描述符”是与打开的文件关联的实际OS资源。 关闭文件会告诉系统释放该资源。
作为OS资源,一个进程可以打开的文件数是有限的:很早以前,在Unix上,每个进程的限制约为20个。 现在,我的OS X盒子强加了256个打开文件的限制(尽管这是一个强制性限制,可以提高)。 其他系统可能会设置数千个或数万个限制(在这种情况下,每个用户,而不是每个进程)。 程序结束时,所有资源都会自动释放。 因此,如果您的程序打开了几个文件,对它们进行了处理然后退出,您可能会很草率,并且永远不会知道其中的区别。 但是,如果您的程序将打开数千个文件,则最好释放已打开的文件,以避免超出操作系统限制。
在进程退出之前关闭文件还有另一个好处:如果打开了一个文件进行写入,则关闭该文件将首先“刷新其输出缓冲区”。 这意味着I / O库通过收集(“缓冲”)您写出的内容并将其批量保存到磁盘来优化磁盘使用。 如果将文本写入文件,然后立即尝试重新打开并读取它,而没有先关闭输出句柄,则会发现并非所有内容都已写出。 另外,如果您的程序突然关闭(带有信号,或者有时甚至通过正常退出),则输出可能永远不会刷新。
关于如何释放文件,已经有很多其他答案,因此,这里只是方法的简要列表:
明确表示为with。(对于python新手请注意:别忘了父母!我的学生喜欢写close(),但没有做。)
推荐:隐式地,通过使用with080语句打开文件。 当到达with块的末尾时,即使在异常终止(由于异常)的情况下,也将调用close()081方法。
with
如果您的python引擎实现了引用管理器或垃圾收集器,则隐式包含该引用。 不建议这样做,因为它不是完全可移植的。 有关详细信息,请参见其他答案。 这就是将with语句添加到python的原因。
隐式地,程序结束时。 如果打开了文件进行输出,则可能存在在所有内容都刷新到磁盘之前退出程序的风险。