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 :

sqlite3: Comment adapter l'encoding à la base de donnée étudiée ? [Python 2.X]


Sujet :

Python

  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2015
    Messages : 9
    Par défaut sqlite3: Comment adapter l'encoding à la base de donnée étudiée ?
    Bonjour à tous,

    Je souhaite lire une base de donnée encodée en latin-1, mais l'encoding par default utilisé par sqlite3 est utf-8.

    La lecture ne pose pas de problème pour la pluppart des élements, mais une ligne (ligne x) d'une table (table 'table') contient un symbole non reconnu par l'encoding utf-8 (° certainement), et donc la requête "SELECT '*' FROM table WHERE id = x" retourne une erreur:
    UnicodeDecodeError: 'utf8' codec can't decode byte 0xb0 in position 891: invalid start byteUnicodeDecodeError: 'utf8' codec can't decode byte 0xb0 in position 891: invalid start byte

    Je voulais donc savoir si il était possible de modifier l'encoding utilisé par sqlite3 (ISO-8859-1).

    Remarque: j'ai essayé d'appeler sys.setdefaultencoding('latin_1') avant et après l'import de sqlite3, le problème persiste.

    Merci d'avance pour vos réponses.

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 703
    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 703
    Par défaut
    Salut,

    Citation Envoyé par MrFlash03 Voir le message
    Remarque: j'ai essayé d'appeler sys.setdefaultencoding('latin_1') avant et après l'import de sqlite3, le problème persiste
    L'encoding côté Sqlite3 se précise via la commande PRAGMA encoding = "latin-1"; qu'il faut passer à (cursor.)execute.
    edit: désolé cela ne s'applique qu'à la création de la base.
    Dans votre cas, il faut modifier (connection).text_factory = lambda s: unicode(s, 'latin-1') si vous êtes en 2.7 ou par (connection).text_factory = lambda s: str(s, 'latin-1') en version 3+

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

  3. #3
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2015
    Messages : 9
    Par défaut
    Merci beaucoup, votre solution fonctionne (en python 2.7 en tout cas).

    Bonne journée.

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 703
    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 703
    Par défaut
    Citation Envoyé par MrFlash03 Voir le message
    Merci beaucoup, votre solution fonctionne (en python 2.7 en tout cas).
    Ça fonctionne dans tous les cas:
    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
    >>> from __future__ import unicode_literals
    >>> import sqlite3
    >>> cx = sqlite3.connect(':memory:')
    >>> cs = cx.cursor()
    >>> cs.execute('''CREATE TABLE test (label text)''')
    <sqlite3.Cursor object at 0x0217F8E0>
    >>> cs.execute("INSERT INTO test VALUES (?)", ('àéïõù'.encode('latin-1'),))
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    sqlite3.ProgrammingError: You must not use 8-bit bytestrings unless you use a te
    xt_factory that can interpret 8-bit bytestrings (like text_factory = str). It is
     highly recommended that you instead just switch your application to Unicode str
    ings.
    >>> qry = "INSERT INTO test VALUES ('àéïõù')"
    >>> cs.execute(qry.encode('latin-1')
    ... )
    <sqlite3.Cursor object at 0x0217F8E0>
    >>> cx.commit()
    >>> cs.execute('SELECT * FROM test')
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    sqlite3.OperationalError: Could not decode to UTF-8 column 'label' with text 'ÓÚ
    ´§¨'
    >>> cx.text_factory = lambda s: unicode(s, 'latin-1')
    >>> cs.execute('SELECT * FROM test')
    <sqlite3.Cursor object at 0x0217F8E0>
    >>> cs.fetchone()
    (u'\xe0\xe9\xef\xf5\xf9',)
    >>>
    L'exemple montre qu'il n'est pas si facile d'écrire du "latin-1" (avec Python) sans avoir modifié le text_encoding car PRAGMA ne supporte qu'UTF-8 et différents UTF-16.

    Il serait peut être plus sage de convertir la base en utf-8 plutôt que de la laisser en l'état - au moins pour s'assurer que tout est "latin-1" sinon vous risquez de récupérer sans erreur des caractères qui s'afficheront bizarrement.

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

  5. #5
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2015
    Messages : 9
    Par défaut
    Merci pour vos réponses.

    J'ai effectivement pu voir que les symbols posant problème pouvaient s'afficher bizarrement. Je n'ai cependant pas mon mot à dire sur la manière d'écrire les bases de données sur lesquelles je travaille. Je suis donc contraint de les laisser en état, mais ce problème d'affichage ne devrait pas poser de problème dans mon cas.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VB.Net] Comment se déplacer dans une Base de données ?
    Par balabonov dans le forum Windows Forms
    Réponses: 7
    Dernier message: 08/08/2006, 21h44
  2. Réponses: 3
    Dernier message: 22/05/2006, 16h02
  3. [VB.NET] Comment créer une table dans base de données ?
    Par ptitesouris dans le forum VB.NET
    Réponses: 3
    Dernier message: 03/05/2006, 08h46
  4. comment changer un alias de base de donnée pour y acceder ?
    Par gsmdu62 dans le forum Bases de données
    Réponses: 5
    Dernier message: 02/05/2006, 09h52
  5. Comment arbitrer le choix Une base de donnée ou deux ?
    Par medstat2 dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 28/03/2006, 16h42

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