2009-08-31 6 views
1

J'ai un problème de lecture d'un fichier txt à insérer dans la table mysql db, Té sniped de ce code:lettres latines avec aiguë: DjangoUnicodeDecodeError

fichier

contient en première ligne: « aclaración »

archivo = open('file.txt',"r")
for line in archivo.readlines():
....body = body + line
model = MyModel(body=body)
model.save()

i obtenir un DjangoUnicodeDecodeError:

codec 'utf8' ne peut pas décoder les octets en position 8: données non valides. Vous avez passé dans 'aclaraci \ xf3n' (type 'str') Indice d'erreur Unicode

La chaîne qui n'a pas pu être encodée/décodée était: araci n.

J'ai essayé de body.decode ('utf-8'), body.decode ('latin-1'), body.decode ('iso-8859-1') sans solution.

Pouvez-vous m'aider s'il vous plaît? Tout indice est apprécié :)

Répondre

5

Si l'on se fie au code \xf3 pour 'ó', il semble que les données soient codées en ISO-8859-1 (ou un parent proche). Donc body.decode('iso-8859-1') devrait être une chaîne Unicode valide (vous ne spécifiez pas ce que "sans solution" signifie - quel message d'erreur obtenez-vous, et où?); Si ce dont vous avez besoin est un bytestring encodé en utf-8, body.decode('iso-8859-1').encode('utf-8') devrait vous en donner un!

+0

Merci Alex, répondre à votre question, ici:> shell manage.py Python 2.5.4 (InteractiveConsole) >>> a = 'a' >>> un '\ xa0' >>> a. décoder ('iso-8859-1'). encoder ('utf-8') '\ xc2 \ xa0' >>> test = unicode (a) Traceback (dernier appel en dernier): Fichier "" , ligne 1, dans UnicodeDecodeError: le codec 'ascii' ne peut pas décoder l'octet 0xa0 en position 0: ordinal pas dans la plage (128) – panchicore

+0

Dans 'test = unicode (a)', vous utilisez implicitement le codec ascii, comme le message d'erreur vous le dit clairement, alors bien sûr, il échoue. Utilisez 'unicode (a, 'iso-8859-1')' si vous connaissez un encodé en ISO-8859-1. Si vous attribuez les résultats de la séquence de codage/décodage à une autre variable, disons b, 'unicode (b, 'utf-8')' fonctionnerait alors. Etc, etc. Peut-être que vous appelez simplement encoder et décoder de cette façon et cela et ne pas attribuer et ensuite utiliser leurs résultats ...?! Souvenez-vous que les chaînes sont immuables, donc les appels de méthode ne les CHANGEENT PAS: ils renvoient des résultats (attribuez-les et utilisez-les! -). –

Questions connexes