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 :

Encore une histoire d'accent


Sujet :

Python

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    125
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Août 2008
    Messages : 125
    Par défaut Encore une histoire d'accent
    Bonjour,
    je me permets de vous demander votre aide car là je bloque.

    J'ai fait un petit programme sous python qui fonctionne assez bien.

    Mais voilà le hic c'est que le résultat de mon programme est un fichier .txt là encore tout va bien, ce qui devrait en texte avec accent est en texte avec accent

    mais pour mettre en forme ce fichier (pour le rendre un peu plus lisible), j'ai créé une Macro sous Excel (on ne se moque pas, je suis en Excel 2000) et là patatra, tout mon texte avec accent devient par exemple : Fréquence
    pour fréquence.

    En entête de mon programme, j'ai mis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    # -*- coding:Latin-1 -*-
    mais quand je ne mets que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    ça fait pareil, et si je ne mets que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #!/usr/bin/python
    # -*- coding:Latin-1 -*-
    Là Python n'est pas d'accord.

    Comment je peux faire et où je dois le mettre.

    Pour info, pour lancer la macro, j'ai écris ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    MiseEnPage = raw_input('Les calculs sont finis. Cliquer sur <ENTER> pour Lancer la mise en page du fichier.')
    macroExcelFile = 'Macro.xls'
     
    filepath = os.path.abspath(macroExcelFile) # S'assurer du chemin utiliser
     
    excel = win32com.client.Dispatch('Excel.Application')
    excel.Visible = True
    workbook = excel.Workbooks.Open(filepath)
    finMiseEnPage = raw_input('Quand la macro est finie, cliquer sur <ENTER>.')
    excel.Quit()
    Merci par avance pour votre aide

    Patricia

  2. #2
    Membre éprouvé

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Par défaut
    Bonjour.

    C'est un problème d'encodage du fichier et non de ton script. Il faut soit
    ouvrir ton fichier TXT avec le bon encodage, si c'est possible, soit "réen-
    coder" le contenu du fichier que te renvoie win-bidule.

    Je ne peux pas t'en dire plus car je suis windophobe et formatlibrophile.

  3. #3
    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,

    Les en-têtes que tu cites, comme "# -*- coding: utf-8 -*-" ne concernent que les chaines "codées en dur" dans la page de code Python. Ce qui suppose que ton éditeur de texte travaille et enregistre tes scripts en utf-8. Mais cela ne veut pas dire que "python travaille en utf-8"! En fait, il travaille en ASCII, sauf quand on lui donne d'autres instructions.


    Considérons que Excel travaille en encodage 'cp1252' (encodage Windows). Si tu travailles en mémoire en 'utf-8', il faut utiliser le module codecs pour enregistrer ton fichier texte.

    Par exemple:

    - tu as un texte qui est en mémoire en utf-8: x = "abcéèçàùôï"

    - tu le convertis en unicode: x = x.decode('utf-8')

    - tu l'enregistres dans un fichier en cp1252:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    import codecs
    with codecs.open('fichier.txt', 'w', 'cp1252') as f:
        f.write(x + '\n')
    Et voilà: ton texte, initialement en utf-8 a été enregistré sur disque en cp1252.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    125
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Août 2008
    Messages : 125
    Par défaut Conversion texte avec accent vers Fichier type Excel
    Merci pour votre aide,

    tu écris :
    with codecs.open('fichier.txt', 'w', 'cp1252') as f:
    f.write(x + '\n')
    Mais question idiote... je le mets où ?

    et comme mon fichier.txt a un nouveau nom à chaque calcul, est-ce que je peux mettre une variable ?

    Merci encore de votre aide

    Patricia

  5. #5
    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
    Citation Envoyé par bourgui78 Voir le message
    je le mets où ?
    J'ai supposé que tu voulais modifier ton programme pour qu'il enregistre le fichier directement en 'cp1252'. Mais peut-être est-ce le 'with' qui te déconcerte? Si oui, voilà la version 'classique':

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    import codecs
    fichier = 'fichier.txt'
    f = codecs.open(fichier, 'w', 'cp1252')
    f.write(x + '\n')
    # etc...
    f.close()
    Citation Envoyé par bourgui78 Voir le message
    est-ce que je peux mettre une variable?
    Bien sûr!

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    125
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Août 2008
    Messages : 125
    Par défaut
    Re-bonjour,
    Voici ce que j'ai mis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    matSFile = codecs.open(directMatS,'w','cp1252')
    Voici ce que je veux écrire dans mon fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    matSFile.write('Longueur de la ligne (m)\tTous les combien de diametres\tPas de mesures entre chaque diametre (m) et son incertitude associee\t'
                   'Incertitude pour les diametres exterieurs du conducteur central (m)\tIncertitudes pour les diamètres intérieurs du conducteur exterieur (m)\t'
                   'Incertitude pour le module de affaiblissement de la ligne (dB)\n')
    si je mets que cela, voici le message d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      File "C:\Python27\lib\codecs.py", line 691, in write
        return self.writer.write(data)
      File "C:\Python27\lib\codecs.py", line 351, in write
        data, consumed = self.encode(object, self.errors)
      File "C:\Python27\lib\encodings\cp1252.py", line 12, in encode
        return codecs.charmap_encode(input,errors,encoding_table)
    UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 218: ordinal not in range(128)
    il y a qq chose qui ne lui plait pas

    merci encore

    Patricia

  7. #7
    Membre Expert

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Par défaut
    C’est du python2… Peut-être en spécifiant explicitement une chaîne unicode*?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    matSFile.write(u'Longueur de la ligne (m)\tTous les combien de diametres\tPas de mesures entre chaque diametre (m) et son incertitude associee\t'
                   'Incertitude pour les diametres exterieurs du conducteur central (m)\tIncertitudes pour les diamètres intérieurs du conducteur exterieur (m)\t'
                   'Incertitude pour le module de affaiblissement de la ligne (dB)\n')
    Sinon, sauf erreur de ma part, on envoie à write une chaîne déjà encodée dans la locale du fichier py lui-même, qu’il faudrait donc d’abord décoder… Ah, les joies des chaînes en py2*!

  8. #8
    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
    Il faut tout lire!

    Comme je l'ai dit dans mon 1er message, le texte à enregistrer par codecs doit être en unicode. Or, le texte que tu écris dans ton script Python est encodé comme tu l'as demandé en haut: "# -*- coding: utf-8 -*-", c'est à dire en utf-8.

    Donc, 2 solutions:

    1- x = u"Incertitudes pour les diamètres intérieurs du conducteur exterieur (m)" avec le 'u' devant les guillemets, et Python se débrouillera pour que que x soit en unicode.

    2- x = "Incertitudes pour les diamètres intérieurs du conducteur exterieur (m)" sans le 'u' devant, et il faudra convertir x de 'utf-8' => unicode comme ça:

    Une fois en unicode, le texte x sera enregistré avec codecs en cp1252.

Discussions similaires

  1. Encore une histoire d'accent
    Par Jozef Chamo dans le forum Flash
    Réponses: 0
    Dernier message: 16/01/2009, 16h37
  2. Encore une histoire pour remplacer les points
    Par Djohn dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 10/08/2007, 11h41
  3. Encore une histoire de code source
    Par olivier03 dans le forum Juridique
    Réponses: 15
    Dernier message: 07/06/2007, 10h48
  4. encore une histoire de transparence
    Par mathou810 dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 28/09/2006, 13h45
  5. [JAR][debutant] encore une histoire de classpath
    Par blaz dans le forum Général Java
    Réponses: 6
    Dernier message: 27/07/2005, 12h28

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