在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文件),但它也拒绝使用。
答案 0 :(得分:0)
好吧,这似乎只是一个编码问题。
尝试了其他解码模式,发现latin-1
是正确的。