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 :

python3 probleme utf-8


Sujet :

Python

  1. #1
    Membre actif
    Avatar de Blo0d4x3
    Inscrit en
    Octobre 2003
    Messages
    583
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 583
    Points : 265
    Points
    265
    Par défaut python3 probleme utf-8
    Bonjour,

    Je un script, tout simple, qui extrait les données d'une DB mysql pour en faire un CSV et un JSON, la bdd est en charset utf8_general_ci.

    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
     
    #!/usr/bin/python3
     
    import MySQLdb
    import csv
    import json
     
    from glob import glob; from os.path import expanduser
     
    web_directory="/tmp"
     
    db = MySQLdb.connect(host="127.0.0.1",
                         user="root",
                         passwd="",
                         db="DBUsers", charset='utf8', use_unicode=True)
     
    db.set_character_set('utf8')
     
    cur = db.cursor()
     
    cur.execute('SET NAMES utf8;')
    cur.execute('SET CHARACTER SET utf8;')
    cur.execute('SET character_set_connection=utf8;')
     
    sql_query = "SELECT * FROM tableUsers"
     
    cur.execute(sql_query)
     
    with open(web_directory + '/output.csv', "w", newline='') as csv_file:
        csv_writer = csv.writer(csv_file)
        csv_writer.writerows(cur)
     
    posts = [dict(id=row[0], date=row[1], url=row[2], type=row[3], hash=row[4], country=row[5], provider=row[6]) for row in cur.fetchall()]
     
    f = open(web_directory + '/output.json', 'w')
    f.write(str(posts))
    f.close()
    Mais il plante avec cette erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        csv_writer.writerows(cur)
    UnicodeEncodeError: 'ascii' codec can't encode characters in position 101-102: ordinal not in range(128)
    Pourtant je set bien le curseur avec le charset utf8, je comprends pas..

    Si quelqu'un a une idée... merci

  2. #2
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2012
    Messages
    321
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2012
    Messages : 321
    Points : 604
    Points
    604
    Par défaut
    Bonjour,

    je ne crois pas que ce oit une question lié à l'UTF,

    Lorsque vous créez votre objet writer, vous ne préciser aucun delimiter.

    Essayer de préciser ces éléments
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    csv_writer = csv.writer(csv_file, delimiter='<àdéfinir>', quotechar='<àdéfinir>')
    Du coup, un caractère posant problème ne sera plus interprété comme une valeur à ajouter à votre csv, mais comme un delimiter ou le caractère encadrant une chaîne.

  3. #3
    Membre actif
    Avatar de Blo0d4x3
    Inscrit en
    Octobre 2003
    Messages
    583
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 583
    Points : 265
    Points
    265
    Par défaut
    J'ai essayé comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    csv_writer = csv.writer(csv_file, delimiter=' ', quotechar=';')
    Mais ca ne change rien

  4. #4
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2012
    Messages
    321
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2012
    Messages : 321
    Points : 604
    Points
    604
    Par défaut
    Je viens de voir que votre csv writer est definit avec un espace en newline.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    csv_writer = csv.writer(csv_file, delimiter=' ', quotechar=';')
    La doc du module csv précise que

    If newline='' is not specified, newlines embedded inside quoted fields will not be interpreted correctly, and on platforms that use \r\n linendings on write an extra \r will be added. It should always be safe to specify newline='', since the csv module does its own (universal) newline handling
    Je pense qu'il vous faut supprimer votre espace. Vous aurez donc quelque chose comme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    csv_writer = csv.writer(csv_file, delimiter='', quotechar=';')

  5. #5
    Membre actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2013
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2013
    Messages : 156
    Points : 218
    Points
    218
    Par défaut
    Bonjour,

    Afin d'être à peu près sure que l'erreur n'est pas due à un problème d'encodage, essayez de spécifier l'encodage quand vous ouvrez le fichier.
    avec un code du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
            try:
                with open(self._path, 'w', encoding="UTF-8", newline='') as csvfile:
                    writer = csv.writer(csvfile, dialect='excel', delimiter=';', quoting=csv.QUOTE_MINIMAL)
                    for data in datas:
                        writer.writerow(data)

  6. #6
    Membre actif
    Avatar de Blo0d4x3
    Inscrit en
    Octobre 2003
    Messages
    583
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 583
    Points : 265
    Points
    265
    Par défaut
    Alors j'ai essayé comme vous m'avez dit:

    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
     
    db.set_character_set('utf8')
     
    cur = db.cursor()
     
    cur.execute('SET NAMES utf8;')
    cur.execute('SET CHARACTER SET utf8;')
    cur.execute('SET character_set_connection=utf8;')
     
    sql_query = "SELECT * FROM Userdb"
     
    cur.execute(sql_query)
     
    try:
            with open(web_directory + '/output.csv', "w", encoding="UTF-8", newline='') as csv_file:
                    csv_writer = csv.writer(csv_file, delimiter=' ', quotechar=';')
                    csv_writer.writerows(cur)
     
            posts = [dict(id=row[0], date=row[1], url=row[2], type=row[3], hash=row[4], country=row[5], provider=row[6]) for row in cur.fetchall()]
     
            f = open(web_directory + '/output.json', 'w')
            f.write(str(posts))
            f.close()
    il a pas aimé le faites que j'ai aucun caractère dans delimiter:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    "delimiter" must be a 1-character string
    Si je met un espace, j'ai droit de nouveau au même message d'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    'ascii' codec can't encode characters in position 158917-158918: ordinal not in range(128)
    Puis avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    csv_writer = csv.writer(csv_file, dialect='excel', delimiter=';', quoting=csv.QUOTE_MINIMAL)
    Toujours cette même erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    'ascii' codec can't encode characters in position 158917-158918: ordinal not in range(128)

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Il serait préférable que vous postiez le traceback plutôt que seulement le message d'erreur...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  8. #8
    Membre actif
    Avatar de Blo0d4x3
    Inscrit en
    Octobre 2003
    Messages
    583
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 583
    Points : 265
    Points
    265
    Par défaut
    Arf oui c'est mieux

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    'ascii' codec can't encode characters in position 158766-158767: ordinal not in range(128)
    Traceback (most recent call last):
      File "export-DB-csv-json.py", line 38, in <module>
        f.write(str(posts))
    UnicodeEncodeError: 'ascii' codec can't encode characters in position 158766-158767: ordinal not in range(128)
    et à la ligne 38 j'ai le fclose du fichier json

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
            f = open(web_directory + 'output.json', 'w')
            f.write(str(posts))
            f.close()
    Du coup, j'ai la même erreur mais plus loin (ce qui est logique), quand je convertis en json, ce qui veut dire que c'est ok avec vos modifs que vous m'avez donnez plus haut

Discussions similaires

  1. Probleme de rafraichissement d'un BDGrid
    Par marmotte dans le forum Bases de données
    Réponses: 10
    Dernier message: 28/05/2004, 18h07
  2. Réponses: 2
    Dernier message: 30/05/2002, 08h54
  3. Probleme sur les chaines de caractere
    Par scorpiwolf dans le forum C
    Réponses: 8
    Dernier message: 06/05/2002, 19h01
  4. [Kylix] Probleme d'execution de programmes...
    Par yopziggy dans le forum EDI
    Réponses: 19
    Dernier message: 03/05/2002, 14h50
  5. [Kylix] Probleme de nombre flottant!!
    Par yopziggy dans le forum EDI
    Réponses: 5
    Dernier message: 02/05/2002, 10h13

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