我在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
被关闭的原因
答案 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)
.....