Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 迭代器应该返回字符串,而不是字节(您是在文本模式下打开文件的吗?)_Python_Django - Fatal编程技术网

Python 迭代器应该返回字符串,而不是字节(您是在文本模式下打开文件的吗?)

Python 迭代器应该返回字符串,而不是字节(您是在文本模式下打开文件的吗?),python,django,Python,Django,我一直面临着文件上传的问题,所以我将在提交时上传一个文件,我想收集文件,读取其中的数据,并将其添加到数据库中,我经常遇到这个错误 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 = g

我一直面临着文件上传的问题,所以我将在提交时上传一个文件,我想收集文件,读取其中的数据,并将其添加到数据库中,我经常遇到这个错误

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))
            )
重要的事实是,
文件是二进制的,
csv.reader
需要字符串,这是一种很好的方法。如果你确定你有少量的数据,你可以把它们全部读入
然后
解码成字符串。例如,您可以使用:

  reader = csv.reader(file.read().decode('utf8').splitlines())
相反,我建议使用
iterdecode
列\u names
内容只是一种简写方式,用于完成代码所做的工作