Python打开与内存泄漏

1 投票
2 回答
6693 浏览
提问于 2025-04-17 17:14

文件什么时候会被关闭呢?

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

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

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

我在想,文件会在什么时候关闭?是当这条语句执行完的时候关闭,还是要等到程序结束才关闭呢?

2 个回答

2

是的,可以这样做。不会出现内存泄漏或类似的问题。

当通过 open() 打开的 file 对象超出作用域并被垃圾回收时,文件句柄会很快被关闭。

不过,如果你想的话,可以考虑这样做:

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

这样可以确保在你完成操作后,文件会立即被关闭。

8

CPython会在文件对象被删除时自动关闭这个文件。这个文件对象会在它的引用计数降到零时被删除,也就是说没有其他变量再指向它了。所以如果你在一个函数里使用了mergeData,当这个函数执行完毕后,局部变量会被清理,文件也会被关闭。

比如说,如果你用allData = open("myinput.txt", "r").read(),那么当.read()执行完返回结果时,引用计数就会降到0,这在CPython中意味着文件会立刻被关闭。

而在其他一些实现,比如Jython或IronPython,文件对象的生命周期管理方式不同,文件对象被真正删除的时机可能会晚很多。

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

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

这样会自动调用.close()来关闭mergeData。你可以查看file.open()的文档with语句的文档

撰写回答