Python: Convertir Unicode en ASCII sans erreurs de fichier CSV
J'ai lu toutes les questions concernant la conversion du format Unicode au format CSV en Python ici dans StackOverflow et je suis toujours perdu. Chaque fois que je reçois un "UnicodeEncodeError: 'ascii' codec ne peut pas encoder les caractères u'\xd1' à la position 12: ordinal pas in range(128)"
buffer=cStringIO.StringIO()
writer=csv.writer(buffer, csv.excel)
cr.execute(query, query_param)
while (1):
row = cr.fetchone()
writer.writerow([s.encode('ascii','ignore') for s in row])
La valeur de ligne est
(56, u"LIMPIADOR BA\xd1O 1'5 L")
où la valeur de \xd10 à la base de données est -, un n avec un diacritiques tilde utilisé en espagnol. J'ai d'abord essayé de convertir la valeur à quelque chose de valable en ascii, mais après avoir perdu autant de temps, j'essaie seulement d'ignorer ces personnages (je suppose que j'aurais le même problème avec des voyelles accentuées).
Je voudrais enregistrer la valeur pour le CSV, de préférence avec le ñ ("LIMPIADOR BAÑO 1'5 L"), mais si pas possible, au moins être en mesure de l'enregistrer ("LIMPIADOR BAO 1'5 L").
- Quelle est votre question?
- Mis à jour avec la question à la fin.
- Pourquoi n'essayez-vous pas de l'encodage de votre Windows local 'ANSI' page de codes? Je devine que vous utilisez Windows, car CSV est le plus couramment utilisé sur Windows, mais s'il vous plaît m'ignorer si c'est à l'échelle de la marque. Sur un *NIX OS je suppose que l'une des 8 bits ISO codages serait approprié, mais je ne suis pas expert.
- Btw, je suis sur Ubuntu.
Vous devez vous connecter pour publier un commentaire.
Correct, ñ n'est pas valide d'un caractère ASCII, donc vous ne pouvez pas encoder au format ASCII. Ainsi, vous pouvez, en tant que votre code ne ci-dessus, les ignorer. Une autre façon, à savoir supprimer les accents, vous pouvez le trouver ici:
Quel est le meilleur moyen de supprimer les accents dans un Python unicode string?
Mais note que les deux techniques peuvent entraîner des effets négatifs, comme les mots signifient vraiment quelque chose de différent, etc. Donc le mieux est de garder les accents. Et puis vous ne pouvez pas utiliser des caractères ASCII, mais vous pouvez utiliser un autre encodage. UTF-8 est la valeur sûre. Latin-1 ou ISO-88591-1 est une commune, mais il ne comprend que l'europe Occidentale caractères. CP-1252 est commune sur Windows, etc, etc.
Donc il suffit de passer en "ascii" quelle que soit l'encodage que vous voulez.
Votre code, en fonction de votre commentaire est:
où
Maintenant, je pense que cela doit fonctionner, mais apparemment ça ne marche pas. Je pense unicode est transmis dans le cvs de l'écrivain, par erreur, de toute façon. Déballer cette longue ligne de ses pièces:
Maintenant votre véritable erreur ne sera pas masqué par le fait que vous vous en tenez tout dans la même ligne. Cela pourrait également pu être évité si vous avez inclus un bon traceback.
u"LIMPIADOR BA\xd1O 1'5 L".encode('utf8')
fonctionne très bien ici. Commeu"LIMPIADOR BA\xd1O 1'5 L".encode('ascii', 'ignore')
. Donc, il y a autre chose qui est faux. Notez que votre réclamation en ligne est(56, u"LIMPIADOR BA\xd1O 1'5 L")
ne peut pas être vrai, comme vous le feriez obtenir'int' object has no attribute 'encode'
, mais ce n'est pas l'erreur vous demande que vous avez. Donc, quelque chose dans votre description du problème est incorrect.writer.writerow([s.encode('utf8') if type(s) is str else s for s in row])
de coder uniquement les chaînes, alors qu'en fait, j'ai eu à vérifier pour l'unicodeif type(s) is unicode
. Les Points sont attribués.