python encodage utf-8
Je suis en train de faire quelques scripts en python. J'ai créer une chaîne que j'ai enregistrer dans un fichier. Cette chaîne a obtenu beaucoup de données, en provenance de l'arborescence et des noms de fichiers d'un répertoire.
Selon convmv, toute mon arborescence est en UTF-8.
Je veux tout garder en UTF-8, car je vais l'enregistrer dans MySQL après.
Pour l'instant, MySQL, qui est en UTF-8, j'ai eu un problème avec certains caractères (comme é ou è - je suis français).
Je veux que python toujours utiliser des chaînes de caractères en UTF-8. J'ai lu quelques infos sur internet et j'ai fait comme cela.
Mon script de commencer avec ceci :
#!/usr/bin/python
# -*- coding: utf-8 -*-
def createIndex():
import codecs
toUtf8=codecs.getencoder('UTF8')
#lot of operations & building indexSTR the string who matter
findex=open('config/index/music_vibration_'+date+'.index','a')
findex.write(codecs.BOM_UTF8)
findex.write(toUtf8(indexSTR)) #this bugs!
Et quand j'execute, voici la réponse : UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 2171: ordinal not in range(128)
Edit:
Je vois, dans mon fichier, l'accent sont joliment écrit. Après la création de ce fichier, je l'ai lu et je l'écris dans MySQL.
Mais je ne comprends pas pourquoi, mais j'ai eu le problème avec l'encodage.
Ma base de données MySQL est en utf8, ou semble être la requête SQL SHOW variables LIKE 'char%'
me renvoie seulement utf8 ou binaire.
Ma fonction ressemble à ceci :
#!/usr/bin/python
# -*- coding: utf-8 -*-
def saveIndex(index,date):
import MySQLdb as mdb
import codecs
sql = mdb.connect('localhost','admin','*******','music_vibration')
sql.charset="utf8"
findex=open('config/index/'+index,'r')
lines=findex.readlines()
for line in lines:
if line.find('#artiste') != -1:
artiste=line.split('[:::]')
artiste=artiste[1].replace('\n','')
c=sql.cursor()
c.execute('SELECT COUNT(id) AS nbr FROM artistes WHERE nom="'+artiste+'"')
nbr=c.fetchone()
if nbr[0]==0:
c=sql.cursor()
iArt+=1
c.execute('INSERT INTO artistes(nom,status,path) VALUES("'+artiste+'",99,"'+artiste+'/")'.encode('utf8')
Et de l'artiste qui sont bien affichées dans le fichier écrit de mauvais dans la BDD.
Quel est le problème ?
- Votre python exemple de code n'est pas valide; il y a des erreurs de syntaxe dans au moins 2 places. Pouvez-vous résoudre ces premiers, s'il vous plaît?
- Êtes-vous d'enregistrer le fichier en utf-8 et non pas un fichier ascii?
Vous devez vous connecter pour publier un commentaire.
Vous n'avez pas besoin de coder les données déjà codé. Lorsque vous essayez de le faire, Python va d'abord essayer de décoder à
unicode
avant de pouvoir l'encoder en arrière de l'UTF-8. Qu'est ce qui est défectueux ici:Il suffit d'écrire vos données directement sur le fichier, il est pas besoin d'encoder déjà des données codées.
Si vous au lieu de construire
unicode
valeurs au lieu de cela, vous serait en effet d'avoir à coder ceux à être accessible en écriture à un fichier. Vous voulez les utilisercodecs.open()
au lieu de cela, qui retourne un objet de fichier qui va encoder les valeurs unicode UTF-8 pour vous.Vous aussi vraiment ne veux pas écrire le UTF-8 BOM, sauf vous ont à l'appui des outils de Microsoft qui ne peut pas lire le format UTF-8 dans le cas contraire (tels que MS le bloc-notes).
Pour votre MySQL insert problème, vous devez faire deux choses:
Ajouter
charset='utf8'
à votreMySQLdb.connect()
appel.Utilisation
unicode
des objets, passtr
objets lors de l'interrogation ou de l'insertion, mais utilisation des paramètres sql de sorte que le connecteur MySQL peut faire la bonne chose pour vous:Il peut réellement fonctionner mieux si vous avez utilisé
codecs.open()
à décoder le contenu automatiquement à la place:Vous pouvez balayer vers le haut sur Unicode et UTF-8 et les codages. Je vous recommande les articles suivants:
La Python Unicode HOWTO
Pragmatique Unicode par Ned Batchelder
Le Minimum Absolu que Tout Développeur Doit Absolument, Positivement Savoir Sur Unicode et les Jeux de Caractères (Pas d'Excuses!) par Joel Spolsky
Malheureusement, la chaîne.encode() la méthode n'est pas toujours fiable. Découvrez ce fil pour plus d'informations: Qu'est-ce que l'infaillible moyen de convertir une chaîne de caractères (utf-8 ou autre) à une simple chaîne de caractères en python