IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Utf-8 et Ascii


Sujet :

Python

  1. #21
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 60
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2006
    Messages : 121
    Par défaut
    Bon alors, je me suis réjouis un peu vite !

    Bizarrement les caractères ü ou encore ß passent bien mais pas les è !!!!!!!

    Cette fois, je crois que je vais partir élever des chêvres et faire du macramé...

    Voilà mon code, si ça inspire quelqu'un pendant que je fais mes baggages...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
    LstChamps=""
    LstValues=""
    TblValues={}
     
    #---- Maintenant, on parcours les colonnes qui ont une correspondance SQL
    for IndCol in range(len(self.TblCorresp)) :
    	if LstChamps!="":
    		LstChamps+=", "
    		LstValues+=", "
     
    	NoColFic=self.TblCorresp[IndCol]["NOCOL"]
    	NomChamp=self.TblCorresp[IndCol]["NOMCHAMP"]
    	LstChamps+=NomChamp
     
    	if (NoColFic>len(self.TblFicCSV[NoLigne])):
    		TblValues[NomChamp]=""
    	else:
    		TblCharset=chardet.detect(self.TblFicCSV[NoLigne][NoColFic])
    		if TblCharset["encoding"]=="ascii" or TblCharset["encoding"]==None :
    			TblValues[NomChamp]=self.TblFicCSV[NoLigne][NoColFic]
    		else :
    			print "-----------------------------------------"
    			print self.TblFicCSV[NoLigne][NoColFic]
    			print TblCharset["encoding"]
    			print unicode(self.TblFicCSV[NoLigne][NoColFic].decode(TblCharset["encoding"]))
    			TblValues[NomChamp]=unicode(self.TblFicCSV[NoLigne][NoColFic].decode(TblCharset["encoding"]))
     
    	#---- Formatage des champs en fonction de leur type
    	if self.TblCorresp[IndCol]["TYPE"]=="char" or self.TblCorresp[IndCol]["TYPE"]=="varchar" or self.TblCorresp[IndCol]["TYPE"]=="nchar" or self.TblCorresp[IndCol]["TYPE"]=="nvarchar" or self.TblCorresp[IndCol]["TYPE"]=="text":
    		#---- Chaîne
    		TblValues[NomChamp]=self.FormatSql(TblValues[NomChamp], "C")
    		LstValues+="'{"+NomChamp+"}'"
    	elif self.TblCorresp[IndCol]["TYPE"]=="datetime" :
    		#---- Date
    		TblValues[NomChamp]=self.FormatSql(TblValues[NomChamp], "D")
    		LstValues+="'{"+NomChamp+"}'"
    	elif self.TblCorresp[IndCol]["TYPE"]=="decimal" :
    		#---- Réel
    		TblValues[NomChamp]=self.FormatSql(TblValues[NomChamp], "R")
    		LstValues+="{"+NomChamp+"}"
    	else :
    		TblValues[NomChamp]=self.FormatSql(TblValues[NomChamp], "E")
    		LstValues+="{"+NomChamp+"}"
     
    Requete="INSERT INTO "+self.NomTable+" ("+LstChamps+") VALUES ("+LstValues+")"
    Requete=unicode(Requete)
     
    try:
    	cur = self.CnxBase.cursor()
    	cur.execute(Requete.format(**TblValues))
    	self.CnxBase.commit()
    except db.ProgrammingError:
    	print "--------- Erreur dans "+self.FichierCourant+" ligne "+str(NoLigne)+"-------------------"
    	print Requete.format(**TblValues)

  2. #22
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 60
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2006
    Messages : 121
    Par défaut
    Tout vient à point à qui sait attendre...

    Je viens de trouver la solution et je vais en faire profiter tout le monde (quelle grandeur d'âme !).

    En fait c'est dans l'encodage que je me suis vautré il ne fallait pas écrire :
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    	TblCharset=chardet.detect(self.TblFicCSV[NoLigne][NoColFic])
    	if TblCharset["encoding"]=="ascii" or TblCharset["encoding"]==None :
    		TblValues[NomChamp]=self.TblFicCSV[NoLigne][NoColFic]
    	else :
    		TblValues[NomChamp]=unicode(self.TblFicCSV[NoLigne][NoColFic].decode(TblCharset["encoding"]))

    mais :
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	TblCharset=chardet.detect(self.TblFicCSV[NoLigne][NoColFic])
    	if TblCharset["encoding"]=="ascii" or TblCharset["encoding"]==None :
    		TblValues[NomChamp]=self.TblFicCSV[NoLigne][NoColFic]
    	else :
    		TblValues[NomChamp]=unicode(self.TblFicCSV[NoLigne][NoColFic].decode("latin-1"))

    Et c'est tout !!!
    Pourquoi ? J'en sais rien, je suis over-gavé par ces histoires d'encodage et de décodage. Tout ce que je sais, c'est que ça marche, tous les caractères passent, les é, les è, les ü, les ß (bon, je vais pas tous les faires non plus...)

  3. #23
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 759
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 759
    Par défaut
    Salut,

    La différence semble être de forcer la valeur de l'encoding à "latin-1" plutôt que d'utiliser celle détectée par chardet.

    ? Je n'ai pas lu le code attentivement mais 'de loin', çà semble détecter l'encoding sur la base de quelques champs plutôt que sur tout le fichier ?

    Comme, in fine, il faut transformer tout çà en Unicode avant de pouvoir l'utiliser, je séparerais complètement la partie transcodage de celle de chargement de la base. Cette dernière n'ayant qu'à traiter des fichiers utf-8.

    Les intérêts pouvant être:
    1 - pouvoir éventuellement écarter les .CSV douteux - plutôt que de polluer la BDD c'est une option "à voir".
    2 - vérifier que le transcodage et chardet "fonctionne raisonnablement".

    Note: "raisonnablement" pouvant être de s'assurer sur un jeu de test ou à chaque "conversion" que la transformation vers utf-8 est réversible.

    Cordialement et meilleurs vœux
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Réponses: 0
    Dernier message: 26/05/2009, 15h08
  2. Transformation code ASCII en UTF-8
    Par identifiant_bidon dans le forum Langage
    Réponses: 1
    Dernier message: 13/11/2007, 14h56
  3. [.NET 2.0] Convertir une chaine utf-8 en Ascii
    Par abelman dans le forum Framework .NET
    Réponses: 2
    Dernier message: 30/04/2007, 20h47
  4. Conversion utf-8 an code ascii
    Par Haplo2006 dans le forum Langage
    Réponses: 2
    Dernier message: 22/03/2007, 10h11
  5. [C#] Encodage en UTF et ASCII
    Par Machjaghjolu dans le forum C#
    Réponses: 3
    Dernier message: 11/11/2005, 02h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo