在Python中,在文件上使用read()之后是否需要使用close()?

时间:2012-08-06 18:09:13

标签: python django memory file-upload file-io

我正在使用Django读取ajax上传的文件以将其存储在模型中。上传请求包含原始上传的图像数据。

def my_view(request):
    upload = request
    model_instance.image_field.save(uniquename, ContentFile(upload.read()))

如果重要,我使用AmazonS3作为上传文件的存储后端。

在包含此代码的函数中的某处,我有内存泄漏。

执行此操作后,是否需要拨打upload.close()来释放资源/内存? 或者我的记忆问题来自其他问题,在这个函数的其他地方?

1 个答案:

答案 0 :(得分:15)

python垃圾收集器将在不再引用文件时关闭文件。

如果你的upload变量是函数中的局部变量,它将在函数返回时被清除。因此,在正常的垃圾收集周期中,所引用的文件upload将自动关闭。

也就是说,关闭文件可能更好。您可以将该文件用作context manager,并在退出上下文时自动关闭:

with open('yourfilepath.ext') as upload:
    model_instance.image_field.save(uniquename, ContentFile(upload.read()))

如果upload是Django为您生成的,打开并准备就绪,您仍然可以使用contextlib.closing decorator自动关闭它:

import contextlib
with contextlib.closing(upload):
     model_instance.image_field.save(uniquename, ContentFile(upload.read()))

要回答你的其余问题:你的泄密最有可能发生在其他地方。