问题描述
我在上传文件时遇到了问题,因此我将在提交时上传文件,我想收集文件并读取其中的数据并将其添加到数据库中,我一直在收到此错误
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())
代替,但是我建议使用iterdecode
。 column_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')