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
内容只是一种简写方式,用于完成代码所做的工作