迭代器应该返回字符串,而不是字节(您是否以文本模式打开文件?)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 = 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只是代码进行的一种简写方式

最新更新