【问题标题】:python open & memory leakspython打开和内存泄漏
【发布时间】:2023-03-15 02:36:02
【问题描述】:

文件何时关闭?

    # Read all data from input file
    mergeData = open( "myinput.txt","r" )
    allData = mergeData.read()
    mergeData.close()

我可以用这个代码代替吗?

allData = read.open( "myinput.txt","r" )

我想知道文件什么时候关闭?将关闭一个语句运行?或者等到程序退出。

【问题讨论】:

  • 我想你的意思是allData = open('myinput.txt').read()
  • 谢谢。我是一个猜测(初学者)的python程序员。

标签: python file-io


【解决方案1】:

当对象被删除时,CPython 会自动关闭一个文件对象;当它的引用计数下降到零时它被删除(没有更多的变量引用它)。所以如果你在函数中使用mergeData,一旦函数执行完毕,局部变量就会被清理干净,文件也会被关闭。

如果您使用allData = open( "myinput.txt","r" ).read(),则引用计数会在.read() 返回的那一刻下降到0,而在CPython 上,这意味着文件会在那里关闭。

在 Jython 或 IronPython 等其他实现中,对象生命周期的管理方式不同,实际删除对象的那一刻可能要晚得多。

使用文件的最佳方式是作为上下文管理器:

with open( "myinput.txt","r" ) as mergeData:
    allData = mergeData.read()

mergeData上调用.close()自动。请参阅file.open() documentationwith statement 的文档。

【讨论】:

  • 哇,我们俩同时写了完全相同的答案。
  • @Iguananaut:这一个经常被问到的问题,可能在某个地方存在欺骗。
  • 通过with open .. as filehandle 文件句柄自动关闭。但是,这在 RHEL5.x 和 SLES10.x 中可用的 Python 2.4 中不起作用。
  • @kvivek:Python 2.4 现在真的很古老了。我正在教授大多数 Python 安装的最佳实践。 :-)
  • asyncio.get_event_loop() 也是如此,还是当相关代码存在于函数内部时更普遍如此?
【解决方案2】:

是的。是的你可以。没有内存泄漏或类似情况。

open() 返回的file 对象超出范围并被垃圾回收后,文件句柄将很快关闭。

但如果您愿意,您可能希望执行以下操作:

with open('myinput.txt') as f:
    data = f.read()

这将确保文件在您完成后立即关闭。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-18
    • 2012-12-02
    • 2011-12-13
    • 2014-02-26
    • 2010-11-27
    • 2017-12-01
    • 2011-09-27
    • 2011-08-26
    相关资源
    最近更新 更多