移出功能范围时Django文件对象关闭-Python3

时间:2019-04-02 09:16:50

标签: django python-3.6

我在django下方有视角

ComponentOverride

输出

from io import TextIOWrapper

def get_header_data(file_obj):
    # perform some operations like
    text_file = TextIOWrapper(file_obj)
    reader = csv.reader(text_file)
    .....
    .....
    file_obj.seek(0)
    print(file_obj.closed, "--> Inside get_header_data method")
    return some_data

def upload(request):
    file_obj = request.FILES["file"]
    print(file_obj.closed, "--> Inside upload before entering in to get_header_data method")
    # Get some headers
    header_data = get_header_data(file_obj)
    # Facing an error at this point file_obj.seek(0)
    print(file_obj.closed, "--> Inside upload after returned from get_header_data method")
    file_obj.seek(0)

这里的问题是,在python3的情况下,当解释器移出上载函数时,我从False--> Inside upload before entering in to get_header_data method False--> Inside get_header_data method True--> Inside upload after returned from get_header_data method ValueError: I/O operation on closed file at line 5 (file_obj.seek(0)) inside upload method 方法发送到file_obj的{​​{1}}被python关闭它返回了。)

相同的代码在get_header_data中正常工作,所以这里可能是问题所在,以及当解释器移出upload方法时Python 2.7被关闭的原因

1 个答案:

答案 0 :(得分:0)

TextIOWrapper对象在销毁基础流后会关闭(__del__方法调用close)。对于您来说,文件对象是关闭的,因为当您从get_header_data返回时,text_file被销毁了。

您可以使用detach将底层原始流与缓冲区分开。

def get_header_data(file_obj):
    # perform some operations like
    text_file = TextIOWrapper(file_obj)
    .....
    .....
    text_file.detach()
    file_obj.seek(0)
    .....