Python 3.x 如何处理在Django中使用表单上传的文件?

Python 3.x 如何处理在Django中使用表单上传的文件?,python-3.x,django,forms,file,Python 3.x,Django,Forms,File,为了上传要处理的文件,我构建了一个带有文件字段的表单。奇怪的是,文件似乎在我可以处理视图中的任何内容之前就关闭了。我在验证表单后遇到ValueError: “对已关闭文件的I/O操作” 我可以看到该文件已被正确检测到,但在尝试读取时已关闭 注:Django版本2.2.25 forms.py class FileImportForm(forms.Form): headers = ["lastname","firstname","gender

为了上传要处理的文件,我构建了一个带有文件字段的表单。奇怪的是,文件似乎在我可以处理视图中的任何内容之前就关闭了。我在验证表单后遇到ValueError:

“对已关闭文件的I/O操作”

我可以看到该文件已被正确检测到,但在尝试读取时已关闭

注:Django版本2.2.25

forms.py

class FileImportForm(forms.Form):
    headers = ["lastname","firstname","gender","title","entity","email","company","address","phone"]
    file = forms.FileField(label='CSV file',validators=[CsvFileValidator(headers)])
    
    def clean_file(self):
        file = self.cleaned_data['file']
        return file   
@login_required
def file_import(request):
    if request.method == 'POST': 
        form = FileImportForm(request.POST,request.FILES)

        if form.is_valid():
            if request.FILES['file']:
                file_post = request.FILES['file']
                # Offending line below (I/O operation on closed file)
                file_content = file_post.read().decode('UTF-8')

                return redirect("/foo")
    else:
        form = FileImportForm()
    
    return render(request,"file_import.html", { 'form': form })
视图.py

class FileImportForm(forms.Form):
    headers = ["lastname","firstname","gender","title","entity","email","company","address","phone"]
    file = forms.FileField(label='CSV file',validators=[CsvFileValidator(headers)])
    
    def clean_file(self):
        file = self.cleaned_data['file']
        return file   
@login_required
def file_import(request):
    if request.method == 'POST': 
        form = FileImportForm(request.POST,request.FILES)

        if form.is_valid():
            if request.FILES['file']:
                file_post = request.FILES['file']
                # Offending line below (I/O operation on closed file)
                file_content = file_post.read().decode('UTF-8')

                return redirect("/foo")
    else:
        form = FileImportForm()
    
    return render(request,"file_import.html", { 'form': form })

如何正确处理上传的文件(读取等)?

发生错误的原因是您没有正确打开文件。以下是工作方式:

file\u post=request.FILES['file']
f=打开(文件“w”后)
由于python的文件操作也带有只读方法,您不能直接执行
file\u content=file\u post.read().decode('UTF-8')
,因为您没有使此文件可写

编辑

由于上载文件类型可能不正确,因此需要进行更多转换。比如:

def my_视图(请求):
上传的文件=请求.FILES['file']
str_text=“”
对于上传的\u文件中的行:
str_text=str_text+line.decode()#“str_text”将为'str'类型
#做点什么
归还某物

这不起作用,它会抛出一个TypeError异常“预期的str、bytes或os.PathLike对象,而不是inMemoryPloadedFile”。类型不是开放的预期类型之一。也许您应该考虑其他方式。由于演示使用的是
txt
文件,因此可能
InMemoryUploadedFile
是另一种不符合python规则的类型。我刚刚编辑了我的答案。你能利用我的编辑吗?这次例外是“关闭文件上的I/O操作”。不知怎的,原始文件的内容需要转换。我在那里放的第二个参考文件是:
uploaded\u file.read()
。如果您正试图实际编写该文件,则可能正在寻找其他内容。