问题描述
我希望网站用户能够将 CSV 文件上传到我的网页。该文件通过带有 FileField 的表单上传。我覆盖了 FormField 的 is_valid 方法 来检查文件是否具有 CSV 扩展名。如果表单有效,我想读取 CSV 的行并将它们保存到模型中。
is_valid 方法运行良好。但是当我尝试按照 is_valid 条件执行代码时,我遇到了“ValueError: I/O operation on closed file”。
Views.py
def upload_file(request):
if request.method == 'POST':
form = UploadFileForm(request.POST,request.FILES)
if form.is_valid():
csv_processor(form.cleaned_data['csv_file'])
#messages.success(request,'Archivo recibido para procesamiento')
return HttpResponseRedirect(reverse('home_page'))
else:
form = UploadFileForm()
return render(request,'products/csv_upload_page.html',{'form': form})
csv_processor 函数
def csv_processor(csv_file):
csv_object = TextIOWrapper(csv_file,encoding='utf-8-sig')
reader = csv.reader(csv_object)
# Code to read lines follows here
forms.py
class UploadFileForm(forms.Form):
csv_file = forms.FileField(label = 'Adjunte archivo csv',validators= [csv_content_validator])
def csv_content_validator(csv_file):
if not csv_file.name.endswith('.csv'):
raise ValidationError('Archivo debe tener extension csv')
return True
csv_object = TextIOWrapper(csv_file,encoding='utf-8-sig')
reader = csv.reader(csv_object)
first_row = next(reader)
headers = ['SKU','Price']
# Check if column names match desired names
for header_index in range(len(headers)):
# Check if first row of the CSV file contains correct names
if first_row[header_index] != headers[header_index]:
raise ValidationError('Column names don't match desired format ')
return True
IOWrapper 流似乎在 csv_processor 函数中关闭,但在验证步骤中打开。知道如何解决这个问题吗?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)