微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从 Django 中的表单数据读取 CSV 文件时出现“ValueError: I/O operation on closed file”

如何解决从 Django 中的表单数据读取 CSV 文件时出现“ValueError: I/O operation on closed file”

我希望网站用户能够将 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 举报,一经查实,本站将立刻删除。