Question

Je suis de la lecture d'un bouquet de chaînes à partir de la base de données mysql à l'aide de python, et après quelques transformations, de les écrire dans un fichier CSV.Cependant je vois certains totalement indésirable caractères figurant dans le fichier csv.Par exemple, quand j'ouvre le fichier csv à l'aide de gvim, je vois des personnages comme <92>,<89>, <94> etc.

Toutes les pensées?J'ai essayé de faire la chaîne.encode('utf-8') avant de les écrire dans un fichier csv, mais qui a donné une erreur UnicodeDecodeError: 'ascii' codec can't decode byte 0x93 in position 905: ordinal not in range(128)

Était-ce utile?

La solution 2

J'ai finalement résolu.J'ai été en utilisant MySQLdb module python pour se connecter à mysql.J'ai juste utilisé charset=utf8 et use_unicode = True lors de la création d'une base de données de connexion avec elle.De plus, j'ai changé la table MySQL du classement utf8_unicode_ci.Enfin, lors de l'écriture de ma chaîne de caractères au format de fichier csv, j'ai utilisé:

file_pointer.write(my_string.encode('ascii', 'ignore'))

Je ne sais pas comment le son de la logique, mais c'est ce que j'ai déterré après plusieurs heures de recherche sur google, et il semble fonctionner pour moi.

Autres conseils

UnicodeDecodeError signifie que vous êtes en train de coder octets, c'est à dire, Python 2 essaie d'abord de le décoder en Unicode et puis l'encoder en utilisant l'encodage spécifié:

>>> b"€".encode('utf-8')
Traceback (most recent call last):
  File "<input>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 0: 
ordinal not in range(128)

Si les données sont un texte (et non pas, par leur nature, les données binaires de l'image);vous devez travailler avec elle à l'aide d'Unicode.Si votre pilote de base de données n'a pas de retour Unicode que de convertir les octets Unicode dès que vous les recevez.

csv module Python 2 ne fonctionne qu'avec des octets.Vous pouvez utiliser UnicodeWriter à partir de les exemples ou semblable à écrire Unicode.

Tous ces "cochonneries" caractères de la plage <80> à <9F>?Si oui, il est très probable qu'ils sont Microsoft "Guillemets" (Windows-125x encodages).Quelqu'un a écrit le texte dans Word ou Outlook, et copier/coller dans une application Web.Les pays latino-1 et UTF-8 égard de ces caractères que les caractères de contrôle, et l'effet habituel, c'est que l'affichage du texte est coupée (Latin-1) ou voyez-vous un ?-in-black-diamond-invalide-caractères (UTF-8).

Notez que Word et Outlook, et quelques autres de MS de produits, de fournir une version UTF-8 de texte pour utiliser le presse-papiers.Au lieu de <80> à <9F> codes, les Guillemets de caractères sera bon multi-octets UTF-8 séquences.Si votre page Web est en UTF-8, vous devez normalement avoir un bon caractère UTF-8 au lieu de la Smart Devis dans Windows-125x encodage.Notez également que ce n'est pas garanti comportement, mais "semble fonctionner assez souvent".Tout dépend de la version UTF-8 de texte disponibles, et bien manipulée (c'est à dire, vous n'avez pas de pâte de, disons, gvim sur le PC, et ensuite copier/coller dans un site Web sous forme de texte).Cela peut aussi bien travailler pour diverses applications PC, tant qu'ils sont à la recherche d'codé en UTF-8 de texte.

Vous pouvez résoudre ces dans vim.Par exemple, pour faire face à <92> (qui est l'apostrophe), ne

:1,$s/CNTRL-V x 92/'/g

Si vous tapez sur CTRL puis V puis x puis 92 (sans les espaces).Vous allez le voir sortir comme

:1,$s/<92>/'/g
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top