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,没有关闭文件。结果,这样的多个操作导致文件资源耗尽,操作系统开始阻止新的打开。