python open&内存泄漏

时间:2013-02-26 21:10:10

标签: python file-io

文件什么时候关闭?

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

我可以替换此代码吗?

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

我想知道该文件何时关闭?该声明是否会被关闭?或者等到程序退出。

2 个答案:

答案 0 :(得分:4)

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() documentationwith statement的文档。

答案 1 :(得分:2)

是。是的你可以。没有内存泄漏或任何类型的内容。

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

虽然如果您愿意,您可能希望做以下事情:

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

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