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

迭代器应返回字符串,而不是字节您是否以文本模式打开文件?

如何解决迭代器应返回字符串,而不是字节您是否以文本模式打开文件?

我在上传文件时遇到了问题,因此我将在提交时上传文件,我想收集文件并读取其中的数据并将其添加数据库中,我一直在收到此错误

Traceback (most recent call last):
  File "/Users/vinaykashyap/opt/anaconda3/lib/python3.7/site-packages/django/core/handlers/exception.py",line 34,in inner
    response = get_response(request)
  File "/Users/vinaykashyap/opt/anaconda3/lib/python3.7/site-packages/django/core/handlers/base.py",line 115,in _get_response
    response = self.process_exception_by_middleware(e,request)
  File "/Users/vinaykashyap/opt/anaconda3/lib/python3.7/site-packages/django/core/handlers/base.py",line 113,in _get_response
    response = wrapped_callback(request,*callback_args,**callback_kwargs)
  File "/Users/vinaykashyap/opt/anaconda3/lib/python3.7/site-packages/django/contrib/auth/decorators.py",line 21,in _wrapped_view
    return view_func(request,*args,**kwargs)
  File "/Users/vinaykashyap/Desktop/Deploy-Testing2/annotating/views.py",line 244,in UploadAdmin
    next(reader)  # skips header
  File "/Users/vinaykashyap/opt/anaconda3/lib/python3.7/csv.py",line 111,in __next__
    self.fieldnames
  File "/Users/vinaykashyap/opt/anaconda3/lib/python3.7/csv.py",line 98,in fieldnames
    self._fieldnames = next(self.reader)
_csv.Error: iterator should return strings,not bytes (did you open the file in text mode?)

任何人都可以提出建议,这将对您有帮助。 在此先感谢

Views.py

def UploadAdmin(request):
    if request.method == 'POST':
         if request.POST.get("action_name") == 'NEXT':
                #  form =  request.FILES['my_uploaded_file'].read()
                 reader = csv.DictReader(request.FILES['my_uploaded_file'].file)
                 next(reader)  # skips header
                 for row in reader:   
                     _,created = NewsItem.objects.get_or_create(
                     headline=row[0],content=row[1],collection=row[2],url=row[3],chunk_id=row[4]
                  )
    return render(request,'annotating/uploadDataAdmin.html')

解决方法

冒着很多魔法的危险,我会做类似的事情:

import codecs

column_names = ['headline','content','collection','url','chunk_id']

def form_handler(request):
    if request.method == 'POST':
        file = request.FILES['my_uploaded_file']

        # iteratively decode file from bytes to string and interpret as CSV
        reader = csv.reader(codecs.iterdecode(file,'utf-8'))

        # skip the header
        next(reader)

        # create items from remaining rows
        for row in reader:
            NewsItem.objects.get_or_create(
                **dict(zip(column_names,row))
            )

重要的事实是file是二进制的,而csv.reader需要字符串,codecs.iterdecode是实现此目的的好方法。如果您确定有少量数据,则可以read全部放入decode字节中,然后将其放入字符串中。例如,您可以使用:

  reader = csv.reader(file.read().decode('utf8').splitlines())

代替,但是我建议使用iterdecodecolumn_names只是执行代码操作的简便方式

,

在遍历一组值之前,必须确保遍历所有类型的类型都是统一的。以文本模式打开文件也可能会有所帮助。例如:

def UploadAdmin(request):
    if request.method == 'POST':
         if request.POST.get("action_name") == 'NEXT':
             reader = csv.DictReader(open('file.csv',"rt",encoding=utf8))
             next(reader)  # skips header
             for row in reader:   
                 _,created = NewsItem.objects.get_or_create(
                 headline=str(row[0]),content=str(row[1),collection=str(row[2]),url=str(row[3]),chunk_id=str(row[4])
              )
    return render(request,'annotating/uploadDataAdmin.html')

如果您需要以与上述类似的方式调用文件,请尝试以下操作:

def UploadAdmin(request):
    if request.method == 'POST':
         if request.POST.get("action_name") == 'NEXT':
             file = request.FILES['my_uploaded_file'].read()
             reader = csv.DictReader(open(file,'annotating/uploadDataAdmin.html')

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。