明确关闭文件重要吗?

2024-12-04 08:56:00
admin
原创
160
摘要:问题描述:在 Python 中,如果你打开文件而不调用close(),或者关闭文件但不使用try-finally或“ with”语句,这会是个问题吗?或者,作为一种编码实践,依赖 Python 垃圾收集来关闭所有文件就足够了吗?例如,如果这样做:for line in open("filename&...

问题描述:

在 Python 中,如果你打开文件而不调用close(),或者关闭文件但不使用try-finally或“ with”语句,这会是个问题吗?或者,作为一种编码实践,依赖 Python 垃圾收集来关闭所有文件就足够了吗?例如,如果这样做:

for line in open("filename"):
    # ... do stuff ...

for... 这是一个问题吗?因为文件永远无法关闭,并且可能会发生异常导致文件无法关闭?还是由于文件超出范围,它肯定会在语句结束时关闭?


解决方案 1:

在您的示例中,文件不能保证在解释器退出之前关闭。在当前版本的 CPython 中,文件将在 for 循环结束时关闭,因为 CPython 使用引用计数作为其主要垃圾收集机制,但这是实现细节,而不是语言的功能。Python 的其他实现不能保证以这种方式工作。例如,IronPython、PyPy 和 Jython 不使用引用计数,因此不会在循环结束时关闭文件。

依赖 CPython 的垃圾收集实现是一种不好的做法,因为它会降低代码的可移植性。如果使用 CPython,可能不会出现资源泄漏,但如果您切换到不使用引用计数的 Python 实现,则需要检查所有代码并确保所有文件都已正确关闭。

供您示例使用:

with open("filename") as f:
     for line in f:
        # ... do stuff ...

解决方案 2:

有些 Python 会在不再引用文件时自动关闭文件,而有些 Python 则不会,而是由操作系统在 Python 解释器退出时决定是否关闭文件。

即使 Python 会为您关闭文件,也不能保证时间:可能是立即关闭,也可能是几秒/几分钟/几小时/几天后关闭。

因此,虽然您可能不会遇到使用 Python 时出现的问题,但让文件保持打开状态绝对不是一个好习惯。事实上,在 cpython 3 中,如果您不关闭文件,您将收到系统必须为您关闭文件的警告。

寓意:自己清理干净。:)

解决方案 3:

虽然在这种特殊情况下使用这种构造是相当安全的,但推广这种做法仍有一些注意事项:

  • 运行可能会耗尽文件描述符,尽管可能性不大,但想象一下寻找这样的错误

  • 在某些系统上,您可能无法删除该文件,例如 win32

  • 如果你运行 CPython 以外的任何程序,你不知道文件何时关闭

  • 如果以写入或读写模式打开文件,则不知道数据何时被刷新

解决方案 4:

该文件确实会被垃圾收集器收集,因此会被关闭。GC 决定何时关闭它,而不是您。显然,这不是推荐的做法,因为如果您在使用完文件后不立即关闭文件,您可能会达到打开文件句柄的限制。如果在for您的循环中,您打开了更多文件并让它们停留在原处,该怎么办?

解决方案 5:

你好,当你打算在同一个 Python 脚本中使用文件描述符的内容时,关闭文件描述符非常重要。经过这么长时间的调试,我今天才意识到这一点。原因是只有在关闭文件描述符后,内容才会被编辑/删除/保存,并且更改才会影响文件!

假设您遇到这种情况:您将内容写入新文件,然后不关闭 fd 而在另一个读取其内容的 shell 命令中使用该文件(不是 fd)。在这种情况下,您将无法按预期获得 shell 命令的内容,如果您尝试调试,则无法轻松找到错误。您还可以在我的博客文章http://magnificentzps.blogspot.in/2014/04/importance-of-closing-file-descriptor.html中阅读更多内容

解决方案 6:

在 I/O 过程中,数据会被缓冲:这意味着数据在写入文件之前会被保存在一个临时位置。

Python 不会刷新缓冲区(即,将数据写入文件),直到它确定您已完成写入。执行此操作的一种方法是关闭文件。

如果您写入文件而不关闭,数据将不会写入目标文件。

解决方案 7:

Python 使用 close() 方法关闭打开的文件。一旦文件关闭,您就无法再次读取/写入该文件中的数据。

如果您尝试再次访问同一个文件,它会引发ValueError,因为该文件已经关闭。

如果引用对象已分配给其他文件,Python 会自动关闭该文件。关闭文件是一种标准做法,因为它可以降低被无端修改的风险。

解决这个问题的另一种方法是...使用语句

如果使用 with 语句打开文件,则会保留一个临时变量用于访问文件,并且只能使用缩进的块来访问它。With 语句本身在执行缩进的代码后调用 close() 方法。

句法:

with open('file_name.text') as file:

    #some code here
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1572  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1355  
  信创产品在政府采购中的占比分析随着信息技术的飞速发展以及国家对信息安全重视程度的不断提高,信创产业应运而生并迅速崛起。信创,即信息技术应用创新,旨在实现信息技术领域的自主可控,减少对国外技术的依赖,保障国家信息安全。政府采购作为推动信创产业发展的重要力量,其对信创产品的采购占比情况备受关注。这不仅关系到信创产业的发展前...
信创和国产化的区别   0  
  信创,即信息技术应用创新产业,旨在实现信息技术领域的自主可控,摆脱对国外技术的依赖。近年来,国货国用信创发展势头迅猛,在诸多领域取得了显著成果。这一发展趋势对科技创新产生了深远的推动作用,不仅提升了我国在信息技术领域的自主创新能力,还为经济社会的数字化转型提供了坚实支撑。信创推动核心技术突破信创产业的发展促使企业和科研...
信创工作   0  
  信创技术,即信息技术应用创新产业,旨在实现信息技术领域的自主可控与安全可靠。近年来,信创技术发展迅猛,对中小企业产生了深远的影响,带来了诸多不可忽视的价值。在数字化转型的浪潮中,中小企业面临着激烈的市场竞争和复杂多变的环境,信创技术的出现为它们提供了新的发展机遇和支撑。信创技术对中小企业的影响技术架构变革信创技术促使中...
信创国产化   0  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用