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

Cla*_*ell 4 python memory django file-io file-upload

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

def my_view(request):
    upload = request
    model_instance.image_field.save(uniquename, ContentFile(upload.read()))
Run Code Online (Sandbox Code Playgroud)

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

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

upload.close()这样做之后我需要打电话来释放资源/记忆吗?
或者我的记忆问题来自其他问题,在这个功能的其他地方?

Mar*_*ers 15

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

如果您的upload变量是函数中的局部变量,则在函数返回时将清除它.因此,upload在正常的垃圾收集循环期间,所引用的文件将自动关闭.

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

with open('yourfilepath.ext') as upload:
    model_instance.image_field.save(uniquename, ContentFile(upload.read()))
Run Code Online (Sandbox Code Playgroud)

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

import contextlib
with contextlib.closing(upload):
     model_instance.image_field.save(uniquename, ContentFile(upload.read()))
Run Code Online (Sandbox Code Playgroud)

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