编程后端开发人员

描述 Python 中 with open 的工作细节。打开/关闭文件时发生了什么,这里有哪些陷阱?

用 Hintsage AI 助手通过面试

答案。

with open(...) as f: 是通过上下文管理器处理文件的标准方法。采用这种方式,Python 在退出 with 块时保证自动关闭文件,即使发生异常也是如此。这排除了文件描述符泄漏和文件锁定的问题。

在块内,可以使用对象的方法操作文件(如 f.read()f.write() 等)。在退出块后(即使出现错误)会调用 f.close() 方法。

示例:

with open('data.txt', 'w') as f: f.write('Hello!') # 此时文件已经关闭

反转提问。

常见问题:

能否确保通过 open 打开的文件会在退出 with 块后立即关闭,即使在块中发生了异常?

答案: 是的,这正是上下文管理器合同所保证的:无论出现何种异常,当退出块时都会调用 __exit__ 方法,从而关闭文件。这是与显式调用 f.close() 相比的主要优势。

由于不了解主题细节而导致的实际错误示例。


故事

在一个大型项目中,日志记录是通过 open('log.txt', 'a') 和显式调用 f.write() 进行的,但总是忘记了 f.close()。经过长时间运行,进程耗尽了所有操作系统的文件描述符,服务停止了工作。


故事

在监控系统中,使用 open 持续打开文件,没有处理异常。发生错误时,文件保持打开状态,这导致在其他进程中尝试再次打开时发生锁定。


故事

开发者通过 open 实现了大型文件的读取,并在函数中间立即执行了 return,没有关闭文件。结果,这样的多个操作导致文件资源耗尽,操作系统开始阻止新的打开。