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 Libellé date Unicode [Python 2.X]


Sujet :

Python

  1. #1
    Membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Avril 2014
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2014
    Messages : 50
    Points : 53
    Points
    53
    Par défaut Problème Libellé date Unicode
    Bonjour,

    Suis débutant dans Phython.

    Dans une édition OpenERP 6.1, dans la première colonne, est imprimer le mois en lettre et l'année.
    Lorsque le mois comporte un accent (Février, Août, Décembre) le rapport plante pour cause de caractère Unicode non reconnu.

    J'ai besoin de votre aide Urgente. merci

    Voici le code:

    -l'inisialisation :

    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
         ym_desc = {}
            for prod_data in prod_datas:
                tdate = datetime.datetime.strptime(prod_data.date, '%Y-%m-%d')
                ym = tdate.strftime('%Y-%m')
                ore_cat = prod_data.ore_type_id.category
                ore_code =  prod_data.ore_type_id.code
                volume = prod_data.volume_of_ore
                weight = prod_data.weight_of_ore
                
                if(ym not in ym_desc):
                    #check base/res/res_lang.py line 56-62
                    lang = context.get('lang','en_US')
                    for ln in tools.get_locales(lang):
                        try:                        
                            locale.setlocale(locale.LC_ALL, str(ln))
                            break
                        except locale.Error:
                            continue
                    #set month year description
                    ym_desc[ym] = tdate.strftime('%B %Y')
    
    - Le code où cela plante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
            row_xml = { 'month' : [], 'ending' : [] }
            for key, row in rows:
                if key != 'ending':
                    tkey = 'month'
                    row_xml[tkey].append('<row monthYear="%s">' % (ym_desc[key]))
                else:
                    tkey = 'ending'
                    row_xml[tkey].append('<row>')
    Enfin, l'erreur affichée:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    utf8
    <row monthYear="août 2014">
    18
    23
    unsupported Unicode code range
     
    (<type 'exceptions.UnicodeDecodeError'>, UnicodeDecodeError('utf8', '<row monthYear="ao\xfbt 2014">', 18, 23, 'unsupported Unicode code range'), <traceback object at 0x03AE3328>)
    J'ai essayé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ym_utf8 = tdate.strftime('%B %Y')
    ym_desc[ym] = unicode( ym_utf8 , 'utf-8')
    Mais sans succès.

    Mille merci pour votre aide

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

    L'erreur est "claire", regardez:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UnicodeDecodeError('utf8', '<row monthYear="ao\xfbt 2014")
    Si Août était écrit en utf-8, le "û" serait codé sur 2 bytes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> s = u'Août'
    >>> s.encode('utf-8')
    'Ao\xc3\xbbt'
    >>>
    Ici, vous avez plutôt du "latin-1":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> s.encode('latin-1')
    'Ao\xfbt'
    >>>
    .strftime vous retourne une chaîne de caractère codé dans le "locale" (c'est une biblio standard de la libC, que Python ne fait que l'appeler).

    Quelles sont les versions de l'OS et de Python?

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

  3. #3
    Membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Avril 2014
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2014
    Messages : 50
    Points : 53
    Points
    53
    Par défaut
    Merci pour cette première réponse que car je commençais à désespérer d'avoir une réponse.

    L'OS utilisé est Microsoft Windows server 2003 R et Python 2.7

    Voici l'entête du code source que j'avais en évidence dans mon précédent message:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    # -*- coding: utf-8 -*-
    import pooler
    from report.interface import report_rml
    from report.interface import toxml
    from tools.translate import _
    import datetime
    import locale
    import tools
    Pour être un peu plus complet là où l'erreur ce produit, voici le code:
    Je vous aie mis en bleu les endroits ou je pense que l'erreur peu se produire et là ou on envois
    les données à l'édition (XML).

    Petit rappel, malgré que par expérience je trouve et comprend l'erreur, je suis débutant en python.
    je n'ai pas écris ce code, j'essaye juste de corriger un bug. Merci de votre aide précieuse.
    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    
     row_xml = { 'month' : [], 'ending' : [] }
            for key, row in rows:
                if key != 'ending':
                    tkey = 'month'
                    row_xml[tkey].append('<row monthYear="%s">' % (ym_desc[key]))
    
                else:
                    tkey = 'ending'
                    row_xml[tkey].append('<row>')
                
                for code in ores['prim']:
                    row_xml[tkey].append('<qty value="%s"/>' % (row['vol']['prim'].get(code,0)))
                row_xml[tkey].append('<qty value="%s"/>' % (row['vol']['prim']['total']))
                for code in ores['sec']:
                    row_xml[tkey].append('<qty value="%s"/>' % (row['vol']['sec'].get(code,0)))
                row_xml[tkey].append('<qty value="%s"/>' % (row['vol']['sec']['total']))
                row_xml[tkey].append('<qty value="%s"/>' % (row['vol']['total']))
                
                for code in ores['prim']:
                    row_xml[tkey].append('<qty value="%s"/>' % (row['ton']['prim'].get(code,0)))
                row_xml[tkey].append('<qty value="%s"/>' % (row['ton']['prim']['total']))
                for code in ores['sec']:
                    row_xml[tkey].append('<qty value="%s"/>' % (row['ton']['sec'].get(code,0)))
                row_xml[tkey].append('<qty value="%s"/>' % (row['ton']['sec']['total']))
                row_xml[tkey].append('<qty value="%s"/>' % (row['ton']['total']))
                row_xml[tkey].append('</row>')
            
            lines_xml = u'''
                    <lines>
                        <colWidths>%s</colWidths>
                        %s
                    </lines>''' % (colWidths, "\n".join([x.decode('utf-8') for x in row_xml['month'] ]))
            
            tablef_xml = u'''
                    <table-footer>
                        <colWidths>%s</colWidths>
                        %s
                    </table-footer>''' % (colWidths, "\n".join(row_xml['ending']))
            
            xml = u'''<?xml version="1.0" ?>
                <report>
                    <report-title>Manipulés mensuel</report-title>
                    <table-header1>
                        <colWidths>20mm,130mm,130mm</colWidths>
                        <field>Volume</field>
                        <field>Tonne</field>
                    </table-header1>
                    <table-header2>
                        <colWidths>20mm,60mm,60mm,10mm,60mm,60mm,10mm</colWidths>
                        <field>Manipulé primaire</field>
                        <field>Manipulé secondaire</field>
                    </table-header2>
                    %s
                    %s
                    %s
                </report>
            ''' % (tableh_xml, lines_xml, tablef_xml)
            return self.post_process_xml_data(cr, uid, xml, context)
    
    report_custom('report.monthly.manipulated', 'cftmc.production.data', '', './cftmc_production/report/monthly_manipulated.xsl')
    # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

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

    Un truc comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            for prod_data in prod_datas:
                tdate = datetime.datetime.strptime(prod_data.date, '%Y-%m-%d')
                ym = tdate.strftime('%Y-%m').decode('cp1252').encode('utf-8')
                ...
    pourrait résoudre le problème (et en créer d'autres ailleurs).

    note: j'essaie d'aider les débutants le mieux que je peux.
    Aider des projets mal vendus ou mal gérés qui se retrouvent sans ressource, c'est du boulot pour des free lance.
    Et vu le nombre de chômeurs que nous avons, faire de l'assistance "gratuite" dans les forums basés sur la bonne volonté des participants me semble déplacé.

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

  5. #5
    Membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Avril 2014
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2014
    Messages : 50
    Points : 53
    Points
    53
    Par défaut
    J'ai enfin trouvé la solution. Un grand merci à wiztricks pour son aide précieuse.

    J'étais très très proche depuis le début, sauf que comme je suis sur un serveur Windows, on doit passer par un décodage avant de coder en utf-8


    Revoyons le code qui provoquais l'erreur:

    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
     
     
            ym_desc = {}
            for prod_data in prod_datas:
                tdate = datetime.datetime.strptime(prod_data.date, '%Y-%m-%d')
                ym = tdate.strftime('%Y-%m')
                ...
                if(ym not in ym_desc):
                    #check base/res/res_lang.py line 56-62
                    lang = context.get('lang','en_US')
                    for ln in tools.get_locales(lang):
                        try:                        
                            locale.setlocale(locale.LC_ALL, str(ln))
                            break
                        except locale.Error:
                            continue
                    #set month year description
                    ym_desc[ym] = tdate.strftime('%B %Y')
     
                ...
     
                # Après initialisation, voici le code provoquant l'erreur:
     
            row_xml = { 'month' : [], 'ending' : [] }
            for key, row in rows:
                if key != 'ending':
                    tkey = 'month'
     --->         row_xml[tkey].append('<row monthYear="%s">' % (ym_desc[key]))
                else:
                    tkey = 'ending'
    Comme je travaille sur Windows serveur 2003, il faut un decodage avant le codage utf-8.
    Revenons a l'initialisation des dates:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #set month year description
    ym_desc[ym] = tdate.strftime('%B %Y')
     
    #doit être écrit en version windows
    ym_desc[ym] = tdate.strftime('%B %Y').decode('cp1252').encode('utf-8')

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

Discussions similaires

  1. problème de date
    Par baboune dans le forum PostgreSQL
    Réponses: 8
    Dernier message: 10/06/2004, 10h52
  2. Problème de date dans MONTHS_BETWEEN
    Par ghostlord79 dans le forum Oracle
    Réponses: 10
    Dernier message: 07/04/2004, 11h21
  3. Problème conversion date
    Par mat.M dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 30/03/2004, 15h05
  4. Problème de conversion unicode
    Par djmalo dans le forum C
    Réponses: 5
    Dernier message: 09/03/2004, 11h48
  5. Encore un probléme de date avec TADO !
    Par bNoureddine dans le forum Bases de données
    Réponses: 2
    Dernier message: 22/02/2004, 18h22

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