gpt4 book ai didi

python - Django FileField 不与 Python 3 的 csv 模块合作

转载 作者:太空宇宙 更新时间:2023-11-04 08:46:06 28 4
gpt4 key购买 nike

我有这个表格:

class CSVImportForm(AuthorshipMixin, FormMixin, forms.Form):

data = forms.FileField()

def import_csv(self):
school_csv = csv.DictReader(self.cleaned_data['data'])
for row in school_csv:
print(row)

import_csv() 的预期目的是将 CSV 导入应用程序的数据库,但为简洁起见已对其进行了更改。

当我尝试遍历 school_csv 时发生异常,我猜这是当 DictReader 第一次尝试读取文件时:

Traceback:
File "/usr/local/lib/python3.5/dist-packages/django/core/handlers/base.py" in get_response
132. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/usr/local/lib/python3.5/dist-packages/django/views/generic/base.py" in view
71. return self.dispatch(request, *args, **kwargs)
File "/usr/local/lib/python3.5/dist-packages/django/views/generic/base.py" in dispatch
89. return handler(request, *args, **kwargs)
File "/usr/local/lib/python3.5/dist-packages/django/views/generic/edit.py" in post
215. return self.form_valid(form)
File "/opt/project/project/import/views.py" in form_valid
16. form.import_csv()
File "/opt/project/project/import/forms.py" in import_csv
67. for row in school_csv:
File "/usr/lib/python3.5/csv.py" in __next__
109. self.fieldnames
File "/usr/lib/python3.5/csv.py" in fieldnames
96. self._fieldnames = next(self.reader)

Exception Type: Error at /import/
Exception Value: iterator should return strings, not bytes (did you open the file in text mode?)

我不相信我有机会选择打开文件的模式。我如何才能以文本模式打开,以便 csv 模块处理它?<​​/p>

我注意到 InMemoryUploadedFile 有一个看起来很有用的 file 属性,但它是一个 io.BytesIO 对象。我想我可以做一些涉及手动指定 encoding.etc 的魔术,但我想这是 Django 可以简化的事情。

解决这个问题的最佳方法是什么?

最佳答案

尝试使用

as_string = self.cleaned_data['data'].read().decode("utf-8")
school_csv = csv.DictReader(as_string)

如果它期望 str

from io import StringIO
school_csv = csv.DictReader(StringIO(as_string))

如果它需要 StringIO。

关于python - Django FileField 不与 Python 3 的 csv 模块合作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40414219/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com