【发布时间】:2014-08-14 12:27:45
【问题描述】:
在 Python 3.3 和 Django 1.6 上
是否可以在 ModelForm 的视图中以文本文件而不是字节的形式打开上传的文件?
这是一些示例代码:
def post(self, request, *args, **kwargs):
"""
Methode POST
Utilisé lors de l'envoie du formulaire
:return: Soit un message de succès, soit le formulaire retourné avec erreurs
"""
form = FormulaireUploadFichierDonnee(request.POST, request.FILES)
if form.is_valid():
fichier = request.FILES['fichier']
volet = form.cleaned_data['volet']
validateur = ValidateurFactory.factory(volet)
compteur_erreurs = 0
liste_obj = []
liste_erreurs = []
for ligne in fichier.readlines():
validateur.ligne = ligne.split('\t')
obj = validateur.creer_objet()
if obj:
liste_obj.append(obj)
else:
compteur_erreurs += 1
liste_erreurs.append(ligne)
if liste_obj:
instance = UploadFichierDonnees(fichier=request.FILES['fichier'])
instance.utilisateur = request.user
instance.save()
return HttpResponse(str(liste_obj) + "<br> Erreurs: " + str(compteur_erreurs))
else:
return HttpResponse(str(liste_erreurs) + "<br> Erreurs: " + str(compteur_erreurs))
else:
return render(request, 'tabstat/vue_ajout_fichier.html', {
'form': form,
})
基本上,我需要遍历文件中的每一行,将它们拆分到选项卡上,并使用验证器从那里处理数据。问题是我无法获取字符串对象,我得到了一个字节字符串。
我尝试用.decode('utf-8')对其进行解码:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe9 in position 62: invalid continuation byte
和.decode('ascii'):
'ascii' codec can't decode byte 0xe9 in position 62: ordinal not in range(128)
,没有成功。我尝试使用 CSV 阅读器(因为它是一个 CSV 文件),但它也无法正常工作。
【问题讨论】:
标签: python django csv encoding utf-8