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 :

Faire un cast tuple -> list


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 22
    Par défaut Faire un cast tuple -> list
    Bonjour à tous,

    Dans un de mes programmes je dois lire un fichier Excel.
    Je le fais via le code suivant :

    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
    def readxlsfile(fichier_xls):
        excel = win32com.client.Dispatch('Excel.Application')
     
        classeur = excel.Workbooks.Open(fichier_xls)
        feuille = classeur.ActiveSheet             #On recupere la feuille courante
        maxcol = feuille.UsedRange.Columns.Count    #Recupere le nombre de colonne maximum
        maxline = feuille.UsedRange.Rows.Count      #Recupere le nombre de ligne maximum
     
        sht = classeur.Worksheets(feuille.name)
        donnees_lues = sht.Range(sht.Cells(1, 1), sht.Cells(maxline, maxcol)).Value
     
        donnees_lues = list(donnees_lues)
     
        #donnees_lues est une matrice de type "tuple" de "tuple"
        #Pour faciliter le traitement par la suite on la convertit en matrice de "list" de "list"
        #Pour finir on convertit chaque case de la matrice en chaîne de caractère
        for i in range(len(donnees_lues)):
            donnees_lues[i]=list(donnees_lues[i])
            del donnees_lues[i][0]      #on supprime la colonne 1
            del donnees_lues[i][3]      #on supprime la colonne 5
            j = 0
            while j < len(donnees_lues[i]):
                donnees_lues[i][j]=str(donnees_lues[i][j])
                j = j + 1
     
        #
        excel.Workbooks.Close()
        excel.Quit()
        del excel
        return donnees_lues
    Le problème c'est que dès qu'il y a un caractère accentué (comme "é, è, ê, ë, à, ù, ...") ou "exotique" (comme "@, °, µ, £, $, ¤, &, `, §, ç, ...") mon script plante et refuse de continuer en me disant ce message d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Traceback (most recent call last):
      File "C:\xxxx\script.py", line 98, in readxlsfile
        donnees_lues[i][j]=str(donnees_lues[i][j])
    UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 6: ordinal not in range(128)
    .
    --> Par exemple ici c'est un "é" que le programme ne peut pas transformer en caractère.

    C'est le cast du tuple en list qui plante. Mais la question est comment faire pour que ça fonctionne?


    Merci pour votre aide

    ffets

  2. #2
    Expert confirmé
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Saône et Loire (Bourgogne)

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

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Par défaut
    C'est plutôt un problème d'unicode:
    => http://python.developpez.com/faq/?page=Unicode

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 22
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        donnees_lues = list(donnees_lues)
        
        #donnees_lues est une matrice de type "tuple" de "tuple"
        #Pour faciliter le traitement par la suite on la convertit en matrice de "list" de "list"
        #Pour finir on convertit chaque case de la matrice en chaîne de caractère
        for i in range(len(donnees_lues)):
            donnees_lues[i]=list(donnees_lues[i])
            del donnees_lues[i][0]      #on supprime la colonne 1
            del donnees_lues[i][3]      #on supprime la colonne 5
            j = 0
            while j < len(donnees_lues[i]):
                donnees_lues[i][j]=str(donnees_lues[i][j]).encode('iso-8859-15')
                j = j + 1
    Merci Guigui_ pour ta réponse. D'après ce que j'ai compris j'ai une chaine unicode à la lecture et il faut que je la mette en chaine normale.
    Pour cela j'ai utilisé la méthode précisée sur le lien que tu m'a donné mais je n'obtient pas de résultat concluant. (le code transformé est en rouge)

    Mais toujours cette erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    donnees_lues[i][j]=str(donnees_lues[i][j]).encode('iso-8859-15')
    UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 6: ordinal not in range(128)
    .

    Peux-tu me dire ce que j'ai mal fait?

    Merci

    ffets

  4. #4
    Expert confirmé
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Saône et Loire (Bourgogne)

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

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Par défaut
    tu peux essayer ceci (c'est pas sûr que cela fonctionne):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    donnees_lues[i][j]=donnees_lues[i][j].encode('iso-8859-15')
    ce qui pose problème est d'appliquer la fonction str à une chaîne unicode

    Sinon fait une recherche sur le forum avec le mot "excel" et tu trouveras d'autres sujets traitant des mêmes problèmes

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 22
    Par défaut
    Ca ne marche pas sans le str().

    J'avais cherché une première fois sur le forum avant de poster. Peut être pas assez je vais réinvestiguer !

    S'il y a d'autres pistes je suis preneur !

    A+

    ffets

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 22
    Par défaut
    Après avoir cherché unicode sur le forum j'ai trouvé ce que je voulais :
    Apparemment pytho encode en ascii par défaut les chaines de caractères traitées.

    Il faut faire ce qui est dit dans les cours et tutoriels pour apprendre Python.

    C'est à dire qu'il faut créer un fichier nommé sitecustomize.py dans le répertoire des librairies de python (par défaut C:\Python25\Lib).
    Dans ce fichier il faut mettre ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #!/usr/bin/env python
    # -*- coding: iso-8859-1 -*-
     
    # Recuperation de la 'locale' par default.
    import locale, sys
    loc = locale.getdefaultlocale()
    if loc[1]:
        encoding = loc[1]
     
    # une version Non-Unicode retournera AttributeError...
    if encoding:
        sys.setdefaultencoding(encoding)
    Je ne comprends pas vraiment ce code mais ça marche et dans le coup le traitement des mes chaines fonctionne dans mon code aussi !!!

    Donc voilà c'est bon à savoir !

    Merci Guigui_ pour ton aide !

    @+

    ffets

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 22
    Par défaut
    à tous,

    Mauvaise nouvelle. Une fois le développement terminé, je créé un executable grâce à py2exe. Le problème c'est que je ne pense pas que py2exe ajoute tout l'interpréteur pythonwin quand il génère l'executable...

    Donc pour en revenir à mon souci, en fichier python mon problème d'accent est résolu tant que je reste avec des scripts en ".py" mais revient à grand pas dès que je passe en programme ".exe".

    J'ai cherché hier soir à régler ce problème d'unicode mais en vain pour le moment.
    Je continue de creuser donc si quelqu'un à une idée de comment je peux lire des caractères accentués je suis preneur !


    merki !

    A+
    ffets

Discussions similaires

  1. Faire le cast d'une collection List<char> en List<int>
    Par Xx_raaY dans le forum Windows Forms
    Réponses: 4
    Dernier message: 27/07/2009, 14h08
  2. [HTML] faire des tabulation dans une liste <select>
    Par renofx1 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 20/01/2006, 23h36
  3. Réponses: 12
    Dernier message: 31/12/2005, 16h01
  4. comment faire un cast d'un CString en int ?
    Par 180degrés dans le forum MFC
    Réponses: 1
    Dernier message: 23/12/2005, 22h02
  5. Selectionnet tous ou faire un clear sur une liste
    Par Canou dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 17/11/2004, 10h26

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