以{str}对象形式读取文件后,是否需关闭句柄?是否创建文件句柄?
文件句柄的创建与关闭问题解答
Great question! Let's break this down clearly for you:
确实会创建文件句柄:当你执行
open(bgz_sfx_html_file, 'r', encoding='utf-8')时,Python会立刻生成一个文件对象(也就是文件句柄),它是操作系统与目标文件之间的连接桥梁。你调用.read()方法正是通过这个句柄读取文件内容,最终赋值给bug_html_file的只是文件内容的字符串副本,和原文件句柄是完全独立的两个对象。自动关闭存在不确定性:在CPython(最常用的Python官方实现)中,因为你没有把文件对象赋值给任何变量,这条语句执行完成后,这个临时文件对象的引用计数会降到0,垃圾回收机制会自动触发它的
__del__方法,进而关闭文件句柄。但这种方式有明显隐患:- 该行为是CPython特有的,像PyPy、Jython这类其他Python实现的垃圾回收时机不固定,可能不会立刻关闭句柄,造成系统资源泄漏。
- 如果程序运行中出现异常,或者文件体积过大,临时对象的销毁可能被延迟,会持续占用系统的文件描述符资源。
更安全规范的写法:使用
with上下文管理器:为了确保文件句柄无论是否发生异常都能被正确关闭,Python官方推荐使用with语句(上下文管理器),这也是行业公认的最佳实践。对应的代码应该是:
with open(bgz_sfx_html_file, 'r', encoding='utf-8') as bug_html_file_obj: bug_html_file = bug_html_file_obj.read()
当with代码块执行完毕后,Python会自动调用文件对象的close()方法,彻底释放资源,完全不需要你手动处理关闭逻辑。
内容的提问来源于stack exchange,提问作者Qex
相关产品推荐
相关产品推荐

