明确关闭文件重要吗?

2024-12-04 08:56:00
admin
原创
159
摘要:问题描述:在 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大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用