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 :

Problème unicode / caractères spéciaux + écriture de fichier


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Mysti¢
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    155
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 155
    Par défaut Problème unicode / caractères spéciaux + écriture de fichier
    Bonjour,

    Alors pour rentrer dans le vif du sujet, rien de mieux que quelques lignes de code :]

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> tab = ['é','à']
    >>> f = open('sortie.txt', 'w')
    >>> f.write(str(tab))
    >>> f.close()
    Code de sortie.txt : Sélectionner tout - Visualiser dans une fenêtre à part
    ['\x82', '\x85']

    Tout simplement, je souhaiterais récupérer les caractères spéciaux correctement dans mon fichier de sortie.
    Si quelqu'un peut m'éclairer, je lui en serai très reconnaissant. Merci

  2. #2
    Membre confirmé Avatar de Mysti¢
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    155
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 155
    Par défaut
    Ça peut toujours servir à quelqu'un, donc :

    Je rencontrais ce problème avec la version 2.6 de Python, je viens d'essayer avec la 3.1 et les caractères spéciaux sont enregistrés correctement. Reste à voir si j'arrive à installer l'intégralité des librairies que j'utilisais dans mon application pour cette version de Python.

    Edition :

    Etant donné que je n'arrive pas à installer les librairies que je souhaite utiliser pour la version 3.1 de Python, il faut que je trouve une autre alternative...

  3. #3
    Membre chevronné Avatar de Pierre Maurette
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 283
    Par défaut
    Essayez une de ces deux lignes, ou une variation, selon ce que vous souhaitez exactement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    f.write(', '.join(tab))
    f.write("['" + "', '".join(tab) + "']")

  4. #4
    Membre Expert
    Avatar de DelphiManiac
    Homme Profil pro
    Homme à tout faire
    Inscrit en
    Mars 2002
    Messages
    1 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Homme à tout faire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 147
    Par défaut
    Par défaut sous python 2.6, les chaines de caractères sont encodés en string de 8 bits, sous python 3.1, les chaines de caractères sont en unicode 16 bits.

    Essayes de déclarer ton tableau en unicode :

    Par contre, il faudrait savoir sous quel encodage tu veux enregistrer ton fichier texte. Mais c'est un début de piste entre la différence pyton 2.6 <-> 3.1

    [edit]Voici une version qui ecrit un fichier encodé en utf8.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
     
    import codecs
     
    tab = [u'é',u'à']
    f = codecs.open('sortie.txt', encoding='utf-8', mode='w')
    for c in tab:
        f.write(c)
    f.close()

  5. #5
    Membre confirmé Avatar de Mysti¢
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    155
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 155
    Par défaut
    Tout d'abord, merci pour vos contributions

    Alors concernant la réponse de Pierre, j'ai essayé vos 2 lignes qui je pense me serviront à plusieurs reprise dans mon application, en revanche le problème s'avère un peu plus complexe que ça. Si dans mon exemple j'ai utilisé un tableau, c'était en pensant qu'on pouvait le convertir directement en chaine de caractère, sans avoir à le parcourir et éventuellement mettre en place un système pour le réécrire éléments par élément.

    Ce qui m'emmène à en venir à la suggestion de DelphiManiac. Je pense partir avec le code que tu me donnes en exemple, comme base (d'ailleurs j'avais déjà utilisé la librairie codecs, mais en me compliquant un peu la tâche pour un résultat quasi nul ^^). En fait... les données que je souhaite exporter dans un fichier de sortie, sont surtout sous forme de dictionnaire :

    Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {'type' : ' croisière', 'destination' : 'Egypte', 'prix' : '600'} ...
    Pensez vous qu'il y ai une façon de réécrire mon dictionnaire d'une traite ? (un peu comme avec l'appel de la méthode join()) Dans le cas contraire je pense procéder avec un traitement conditionnel à chaque tour de boucle pour conserver la structure de mon dictionnaire.

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 752
    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 752
    Par défaut
    Salut
    Pour sérialiser des structures Python, Pickle fait cela très bien.
    Maintenant, s'il ne s'agit que de dictionnaires, on peut regarder aussi du côté de JSON.
    Reste à savoir combien de ces structures similaires ou pas il faudra stocker et arbitrer sur la pertinence de passer par un SGDB de type SQLite.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Il ne faut pas confondre l'encodage, tel que Python le fait dans la mémoire ou sur disque, avec ce qui est affiché dans la console d'affichage.

    Actuellement, même si une chaine est correctement encodée, son affichage à l'intérieur d'une liste ou d'un dictionnaire est incorrect:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    z = "abcéèçàù"
    print z
    abcéèçàù 
    print [z]
    ['abc\xe9\xe8\xe7\xe0\xf9']
    La seule manière d'obtenir un affichage correct est de transformer pour l'affichage (et pour l'affichage seulement) la liste en chaine comme par exemple:

    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
     
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    from __future__ import division
     
    import sys
     
    def liste2chaine(L):
        ch = '['
        if ch!=[]:
            for e in L:
                ch += e +  ', '
            ch = ch[:-2]
        ch += ']'
        return ch
     
    x = "abcéèçàù" # ça, c'est en utf-8 à cause du coding
    y = x.decode('utf-8'). encode(sys.stdout.encoding) # y est encodé pour l'affichage
    print y
    abcéèçàù 
    print liste2chaine([y])
    [abcéèçàù]
    Tyrtamos

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

Discussions similaires

  1. Réponses: 15
    Dernier message: 04/01/2007, 08h47
  2. [MySQL] Problèmes avec caractères spéciaux
    Par brokengillou dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 27/04/2006, 17h02
  3. Probléme encodage caractéres spéciaux MYSQL
    Par FoxLeRenard dans le forum Installation
    Réponses: 1
    Dernier message: 20/02/2006, 12h10
  4. [SOAP] problème de caractères spéciaux
    Par ep31 dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 02/12/2005, 17h43
  5. [SQL Server] problème de caractères spéciaux
    Par mbibim63 dans le forum MS SQL Server
    Réponses: 10
    Dernier message: 02/06/2005, 18h38

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