繁体   English   中英

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

[英]Django FileField not cooperating with Python 3's csv module

我有这个表格:

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 模块能够处理它?

我注意到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。

还有一个流媒体的变体:

reader = csv.DictReader(io.TextIOWrapper(request.FILE["csv"]))

它应该与巨大的东西更好地工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM