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 accents et regex


Sujet :

Python

  1. #1
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2011
    Messages : 28
    Par défaut problème accents et regex
    Je suis un débutant en python et je rencontre le comportement étrange suivant:

    Python 2.7.3 (default, Apr 10 2012, 23:31:26) [MSC v.1500 32 bit (Intel)] on win
    32
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import re
    >>> print re.findall(u'à',u'voilà')
    [u'\xe0']
    >>> print re.match(u'à',u'voilà')
    None
    >>>

    Merci de m'aider car pour un débutant le codage des caractères en lecture de fichiers "texte" c'est le mystère total...

  2. #2
    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
    Ce n’est pas un problème d’accent, c’est un problème de match()*!

    En effet, cette fonction ne matche qu’au début de la str passée…

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> print re.match(u'.*à', u'voilà')
    <_sre.SRE_Match object at 0x7fbba12e91d0>
    Pour matcher n’importe où dans la chaîne, il faut utiliser search()*:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> print re.search(u"à", u"voilà")
    <_sre.SRE_Match object at 0x7fbba12e91d0>
    PS*: Pensez toujours aux balise [CODE] (le #, dans la barre d’outils).

  3. #3
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2011
    Messages : 28
    Par défaut
    Oui, en effet j'étais perdu...
    Merci pour la réponse!


  4. #4
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2011
    Messages : 28
    Par défaut
    Je passe aux problèmes suivants:

    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
    #!/usr/bin/python
    #-*- coding: iso-8859-15 -*-
     
    import re
    import csv
    import sys
     
     
    fichier = open('AvecDesAccents.txt','r')
     
    for ligne in fichier.readlines():
        print ligne.decode('latin-1')
        if re.search(unicode('là','latin-1') ,unicode(ligne,'latin-1')) is not None:
            print 'il y a des à'.decode('latin-1')
            print re.findall('là'.decode('latin-1') ,ligne.decode('latin-1'))
    Et la réponse
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     þf i c h i e r   t e s t
     
       é   à   ç   è
     
     v o i l à !
     
     e t
     
     1 9 / 1 0 / 2 0 1 2 | V o t r e * o r d r e * p e r m a n e n t   - -   S O * 6
     1 0 - 8 0 5 8 0 4 4 - 5 4   B E 1 1 * 2 1 0 * 0 4 6 3 5 5 9 * 4 8 * M M E   I N
     G E N B L E E K - O O S T E R L I N C K * B E   C o m : * E P A R G N E   D a t
     e * v a l e u r : * 1 9 / 1 0 / 2 0 1 2 | - 2 5 5 , 1 1
    Alors que le fichier source contient:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     þf i c h i e r   t e s t
     
       é   à   ç   è
     
     v o i l à !
     
     e t
     
     1 9 / 1 0 / 2 0 1 2 | V o t r e * o r d r e * p e r m a n e n t   - -   S O * 6
     1 0 - 8 0 5 8 0 4 4 - 5 4   B E 1 1 * 2 1 0 * 0 4 6 3 5 5 9 * 4 8 * M M E   I N
     G E N B L E E K - O O S T E R L I N C K * B E   C o m : * E P A R G N E   D a t
     e * v a l e u r : * 1 9 / 1 0 / 2 0 1 2 | - 2 5 5 , 1 1
    Problème de codage ?

    Merci encore.

  5. #5
    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
    Ben, vu que vous faites une recherche sur “là”, et que votre fichier de test ne contient aucun “là” (tout au plus un “l à”, notez l’espace)…

    Mais vous faites une drôle de salade avec vos encode/decode/unicode à tout va… Autant travailler entièrement en unicode, non*?

    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
    #!/usr/bin/python
    #-*- coding: iso-8859-15 -*-
     
    import re
    import csv
    import sys
     
     
    fichier = open('AvecDesAccents.txt','r')
     
    for ligne in fichier.readlines():
        ligne = ligne.decode('latin-1')
        print ligne
        if re.search(u'là' , ligne) is not None:
            print u'il y a des là'
            print re.findall(u'là' ,ligne)

  6. #6
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2011
    Messages : 28
    Par défaut
    Merci pour la réponse, mais dans le fichier source il n'y a pas de blanc (visible).
    C'est le copier coller qui en rajoute...

    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
    #!/usr/bin/python
    #-*- coding: iso-8859-15 -*-
     
    import re
    import csv
    import sys
     
     
    fichier = open('AvecDesAccents.txt','r')
     
    for ligne in fichier.readlines():
        ligne= ligne.decode('latin-1')
        print ligne
        if re.search(u'l.*à' ,ligne) is not None:
            print u'il y a des l..à'
        if re.search(u'l à' ,ligne) is not None:
            print u'il y a des l à'
    donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     þf i c h i e r   t e s t
     
       é   à   ç   è
     
     v o i l à !
     
    il y a des l..à
     e t
     
     1 9 / 1 0 / 2 0 1 2 | V o t r e * o r d r e * p e r m a n e n t   - -   S O * 6
     1 0 - 8 0 5 8 0 4 4 - 5 4   B E 1 1 * 2 1 0 * 0 4 6 3 5 5 9 * 4 8 * M M E   I N
     G E N B L E E K - O O S T E R L I N C K * B E   C o m : * E P A R G N E   D a t
     e * v a l e u r : * 1 9 / 1 0 / 2 0 1 2 | - 2 5 5 , 1 1
    Je suis en effet perdu... et donc encore merci

  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
    Moui… Donc, ce ne sont pas des espaces, mais il y a quand même quelque chose (peut-être des espaces à chasse nulle*?)*! Le copier-coller ne rajoutera jamais rien, normalement*!

    Difficile de vous aider plus sans le fichier original sous la main (c’est quel format, au fait*? Sûrement pas un simple txt, en tout cas…). Peut-être pouvez-vous l’attacher en pièce jointe à un prochain post (panneau Options supplémentaires sous celui de réponse)*?

  8. #8
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2011
    Messages : 28
    Par défaut
    Toujours merci de votre aide!

    Voilà..
    Fichiers attachés Fichiers attachés

  9. #9
    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
    Hmmm… Le problème vient bien de votre AvecDesAccents.txt, il est bien en latin-1, mais contient de drôles de choses…

    Voici un print “brut” (lecture binaire) de son contenu!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    \xff\xfef\x00i\x00c\x00h\x00i\x00e\x00r\x00 \x00t\x00e\x00s\x00t\x00\r\x00\n\x00 \x00\xe9\x00 \x00\xe0\x00 \x00\xe7\x00 \x00\xe8\x00 \x00\r\x00\n\x00v\x00o\x00i\x00l\x00\xe0\x00!\x00\r\x00\n\x00e\x00t\x00\r\x00\n\x001\x009\x00/\x001\x000\x00/\x002\x000\x001\x002\x00|\x00V\x00o\x00t\x00r\x00e\x00\xa0\x00o\x00r\x00d\x00r\x00e\x00\xa0\x00p\x00e\x00r\x00m\x00a\x00n\x00e\x00n\x00t\x00 \x00-\x00-\x00 \x00S\x00O\x00\xa0\x006\x001\x000\x00-\x008\x000\x005\x008\x000\x004\x004\x00-\x005\x004\x00 \x00B\x00E\x001\x001\x00\xa0\x002\x001\x000\x00\xa0\x000\x004\x006\x003\x005\x005\x009\x00\xa0\x004\x008\x00\xa0\x00M\x00M\x00E\x00 \x00I\x00N\x00G\x00E\x00N\x00B\x00L\x00E\x00E\x00K\x00-\x00O\x00O\x00S\x00T\x00E\x00R\x00L\x00I\x00N\x00C\x00K\x00\xa0\x00B\x00E\x00 \x00C\x00o\x00m\x00:\x00\xa0\x00E\x00P\x00A\x00R\x00G\x00N\x00E\x00 \x00D\x00a\x00t\x00e\x00\xa0\x00v\x00a\x00l\x00e\x00u\x00r\x00:\x00\xa0\x001\x009\x00/\x001\x000\x00/\x002\x000\x001\x002\x00|\x00-\x002\x005\x005\x00,\x001\x001\x00\r\x00\n\x00
    Me demande d’où sortent tous ces caractères NULL*! Une fois supprimés, l’ensemble marche bien pour moi.

  10. #10
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonsoir,

    Je ne suis pas trop pro des encodages (vraiment pas ? sans doute... ) mais pourquoi ne pas utiliser codecs pour lire le fichier ?
    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
    #!/usr/bin/python
    #-*- coding: UTF-8 -*-
    import sys
    import codecs
    import re
     
     
    BOM = {(0x00, 0x00, 0xFE, 0xFF) : ("UTF_32BE", "UTF-32, big-endian"),
           (0xFF, 0xFE, 0x00, 0x00) : ("UTF_32LE", "UTF-32, little-endian"),
           (0xFE, 0xFF, None, None) : ("UTF_16BE", "UTF-16, big-endian"), 
           (0xFF, 0xFE, None, None) : ("UTF_16LE", "UTF-16, little-endian"), 
           (0xEF, 0xBB, 0xBF, None) : ("UTF_8", "UTF-8")}
    SOURCE = 'AvecdesAccents.txt'
     
     
    with open(SOURCE, 'rb') as fd:
        (b1, b2, b3, b4) = tuple(map(ord, fd.read(4)))
    for k in BOM:
        if (b1, b2, b3, b4) in BOM:
            encodage, toprint = BOM[(b1, b2, b3, b4)][0], BOM[(b1, b2, b3, b4)][1]
            break
        elif (b1, b2, b3, None) in BOM:
            encodage, toprint = BOM[(b1, b2, b3, None)][0], BOM[(b1, b2, b3, None)][1]
            break
        elif (b1, b2, None, None) in BOM:
            encodage, toprint = BOM[(b1, b2, None, None)][0], BOM[(b1, b2, None, None)][1]
            break
    print("Encodage found in bom: %s" % toprint)
    print("Try to decode... (%s)" % toprint)
    with open(SOURCE, 'r') as fd:
        lines = fd.readlines()
    try:
        for line in lines:
            print(line.decode(encodage))
        print("\n")
    except UnicodeDecodeError as e:
        print("UnicodeDecodeError ! (%s)" % toprint)
        print("Raison : %s" % e.reason)
        print("Position : %s\n" % e.start)
    except:
        print("Unexpected error:", sys.exc_info()[0], "\n")
        raise
    print("Try to read with 'codecs'\nContent:")
    with codecs.open(SOURCE, "r", encodage) as fd:
        lines = fd.readlines()
        for line in lines:
            print(line)
    print("Try with 're'")
    for ligne in lines:
        if re.search(u'l.*à' ,ligne):
            print 'il y a des l..à'
        if re.search(u'l à' ,ligne):
            print 'il y a des l à'
    Sortie
    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
    Encodage found in bom: UTF-16, little-endian
    Try to decode... (UTF-16, little-endian)
    UnicodeDecodeError ! (UTF-16, little-endian)
    Raison : truncated data
    Position : 28
     
    Try to read with 'codecs'
    Content:
    fichier test
     
     é à ç è 
     
    voilà!
     
    et
     
    19/10/2012|Votre*ordre*permanent -- SO*610-8058044-54 BE11*210*0463559*48*MME INGENBLEEK-OOSTERLINCK*BE Com:*EPARGNE Date*valeur:*19/10/2012|-255,11
     
    Try with 're'
    il y a des l..à
    @+

  11. #11
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2011
    Messages : 28
    Par défaut
    Oula... cela semble très complet...

    J'essaye de comprendre...

    Encore merci...

  12. #12
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2011
    Messages : 28
    Par défaut
    heu...

    ça plante...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Microsoft Windows [version 6.1.7601]
    Copyright (c) 2009 Microsoft Corporation. Tous droits réservés.
     
    C:\Users\Utilisateur\Documents>cd Divers
     
    C:\Users\Utilisateur\Documents\Divers>python testlecture.py
      File "testlecture.py", line 50
        if re.search(u'l.*Ó' ,ligne):
    SyntaxError: (unicode error) 'utf8' codec can't decode byte 0xe0 in position 0:
    unexpected end of data
     
    C:\Users\Utilisateur\Documents\Divers>
    Toujours merci...

  13. #13
    Membre Expert
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 952
    Par défaut
    Salut,

    PauseKawa, sais-tu que je sauve quasiment tous tes posts que j'ai lus sous forme de snippets? Là, l'interprétation du BOM, par exemple, super!

    Me demande d’où sortent tous ces caractères NULL*! Une fois supprimés, l’ensemble marche bien pour moi.
    En fait si c'est de l'utf-16 comme l'annonce le script de PauseKawa, tous les codes ascii (donc inférieurs à 128) sont complétés avec 0 pour tenir sur les 16 bits annoncés par l'encodage.

    A+

    Pfeuh

  14. #14
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2011
    Messages : 28
    Par défaut
    En supprimant les dernières lignes:

    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
    #!/usr/bin/python
    #-*- coding: UTF-8 -*-
    import sys
    import codecs
    import re
     
     
    BOM = {(0x00, 0x00, 0xFE, 0xFF) : ("UTF_32BE", "UTF-32, big-endian"),
           (0xFF, 0xFE, 0x00, 0x00) : ("UTF_32LE", "UTF-32, little-endian"),
           (0xFE, 0xFF, None, None) : ("UTF_16BE", "UTF-16, big-endian"), 
           (0xFF, 0xFE, None, None) : ("UTF_16LE", "UTF-16, little-endian"), 
           (0xEF, 0xBB, 0xBF, None) : ("UTF_8", "UTF-8")}
    SOURCE = 'AvecdesAccents.txt'
     
     
    with open(SOURCE, 'rb') as fd:
        (b1, b2, b3, b4) = tuple(map(ord, fd.read(4)))
    for k in BOM:
        if (b1, b2, b3, b4) in BOM:
            encodage, toprint = BOM[(b1, b2, b3, b4)][0], BOM[(b1, b2, b3, b4)][1]
            break
        elif (b1, b2, b3, None) in BOM:
            encodage, toprint = BOM[(b1, b2, b3, None)][0], BOM[(b1, b2, b3, None)][1]
            break
        elif (b1, b2, None, None) in BOM:
            encodage, toprint = BOM[(b1, b2, None, None)][0], BOM[(b1, b2, None, None)][1]
            break
    print("Encodage found in bom: %s" % toprint)
    print("Try to decode... (%s)" % toprint)
    with open(SOURCE, 'r') as fd:
        lines = fd.readlines()
    try:
        for line in lines:
            print(line.decode(encodage))
        print("\n")
    except UnicodeDecodeError as e:
        print("UnicodeDecodeError ! (%s)" % toprint)
        print("Raison : %s" % e.reason)
        print("Position : %s\n" % e.start)
    except:
        print("Unexpected error:", sys.exc_info()[0], "\n")
        raise
    print("Try to read with 'codecs'\nContent:")
    with codecs.open(SOURCE, "r", encodage) as fd:
        lines = fd.readlines()
        for line in lines:
            print(line)
    print("Try with 're'")
    #for ligne in lines:
    #    if re.search(u'l.*à' ,ligne):
    #        print 'il y a des l..à'
    #    if re.search(u'l à' ,ligne):
    #        print 'il y a des l à'
    Cela dépasse mais compétences...
    Mais c'est super intéressant!
    Encore merci...

    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
     
    C:\Users\Utilisateur\Documents\Divers>python testlecture.py
    Encodage found in bom: UTF-16, little-endian
    Try to decode... (UTF-16, little-endian)
    UnicodeDecodeError ! (UTF-16, little-endian)
    Raison : truncated data
    Position : 28
     
    Try to read with 'codecs'
    Content:
    Traceback (most recent call last):
      File "testlecture.py", line 47, in <module>
        print(line)
      File "C:\Python27\lib\encodings\cp850.py", line 12, in encode
        return codecs.charmap_encode(input,errors,encoding_map)
    UnicodeEncodeError: 'charmap' codec can't encode character u'\ufeff' in position
     0: character maps to <undefined>

  15. #15
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonsoir,

    Pour la première erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SyntaxError: (unicode error) 'utf8' codec can't decode byte 0xe0 in position 0:
    unexpected end of data
    remplacez #-*- coding: UTF-8 -*- par #-*- coding: iso-8859-15 -*- (Je ne suis pas sous Windows...)

    La seconde
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      File "C:\Python27\lib\encodings\cp850.py", line 12, in encode
        return codecs.charmap_encode(input,errors,encoding_map)
    UnicodeEncodeError: 'charmap' codec can't encode character u'\ufeff' in position
     0: character maps to <undefined>
    Signale que cp850 n'est pas le bon (in position 0).
    Dans ce sens je serait bien pour la création d'un fichier converti en mémoire (cStringIO)

    Attendons de voir l'avis des pros.

    @+

  16. #16
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonjour,

    Pour info j'ai reproduit votre erreur comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    with codecs.open(SOURCE, "r", encodage) as fd:
        lines = fd.readlines()
    for line in lines:
        print(line.encode('iso-8859-15'))
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Try to read with 'codecs'
    Content:
    Traceback (most recent call last):
      File "convert.py", line 47, in <module>
        print(line.encode('iso-8859-15'))
      File "/usr/lib/python2.6/encodings/iso8859_15.py", line 12, in encode
        return codecs.charmap_encode(input,errors,encoding_table)
    UnicodeEncodeError: 'charmap' codec can't encode character u'\ufeff' in position 0: character maps to <undefined>
    Chez moi print(line.encode('UTF-8')) fonctionne sans souci.

    Testez ceci pour voir:
    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
    #!/usr/bin/python
    #-*- coding: iso-8859-15 -*-
    import sys
    import codecs
    import re
     
     
    BOM = {(0x00, 0x00, 0xFE, 0xFF) : ("UTF_32BE", "UTF-32, big-endian"),
           (0xFF, 0xFE, 0x00, 0x00) : ("UTF_32LE", "UTF-32, little-endian"),
           (0xFE, 0xFF, None, None) : ("UTF_16BE", "UTF-16, big-endian"), 
           (0xFF, 0xFE, None, None) : ("UTF_16LE", "UTF-16, little-endian"), 
           (0xEF, 0xBB, 0xBF, None) : ("UTF_8", "UTF-8")}
    SOURCE = 'AvecdesAccents.txt'
     
     
    with open(SOURCE, 'rb') as fd:
        (b1, b2, b3, b4) = tuple(map(ord, fd.read(4)))
    for k in BOM:
        if (b1, b2, b3, b4) in BOM:
            encodage, toprint = BOM[(b1, b2, b3, b4)][0], BOM[(b1, b2, b3, b4)][1]
            break
        elif (b1, b2, b3, None) in BOM:
            encodage, toprint = BOM[(b1, b2, b3, None)][0], BOM[(b1, b2, b3, None)][1]
            break
        elif (b1, b2, None, None) in BOM:
            encodage, toprint = BOM[(b1, b2, None, None)][0], BOM[(b1, b2, None, None)][1]
            break
    print("Encodage found in bom: %s" % toprint)
    print("Try to decode... (%s)" % toprint)
    with open(SOURCE, 'r') as fd:
        lines = fd.readlines()
    try:
        for line in lines:
            print(line.decode(encodage))
        print("\n")
    except UnicodeDecodeError as e:
        print("UnicodeDecodeError ! (%s)" % toprint)
        print("Raison : %s" % e.reason)
        print("Position : %s\n" % e.start)
    except:
        print("Unexpected error:", sys.exc_info()[0], "\n")
        raise
    print("Try to read with 'codecs'\nContent:")
    with codecs.open(SOURCE, "r", encodage) as fd:
        lines = fd.readlines()
    for line in lines:
        print(line.encode('iso-8859-15'))
    print("Try with 're'")
    for ligne in lines:
        if re.search(u'l.*à' ,ligne):
            print 'il y a des l..à'
        if re.search(u'l à' ,ligne):
            print 'il y a des l à'
    Ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for line in lines:
        line = line.encode('iso-8859-15')
        print("Try with 're'")
        if re.search(u'l.*à' ,ligne):
            print 'il y a des l..à'
        if re.search(u'l à' ,ligne):
            print 'il y a des l à'
    @+

  17. #17
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonjour,

    Citation Envoyé par pfeuh Voir le message
    Là, l'interprétation du BOM, par exemple, super!
    Ben en fait non : Le choix d'un dico n'est pas une bonne idée pour une itération.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    >>> for k in BOM:
    ...      print BOM[k]
    ... 
    ('UTF_16LE', 'UTF-16, little-endian')
    ('UTF_32BE', 'UTF-32, big-endian')
    ('UTF_32LE', 'UTF-32, little-endian')
    ('UTF_16BE', 'UTF-16, big-endian')
    ('UTF_8', 'UTF-8')
    L'UTF-16LE (0xFF, 0xFE) est traité avant l'UTF-32LE (0xFF, 0xFE, 0x00, 0x00) ce qui fait qu'un bom UTF-32LE sera interprété comme de l'UTF-16LE.
    Pour l'itération une liste ou un tuple serait plus juste, style:
    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
    BOM = (((0x00, 0x00, 0xFE, 0xFF), "UTF_32BE", "UTF-32, big-endian"),
           ((0xFF, 0xFE, 0x00, 0x00), "UTF_32LE", "UTF-32, little-endian"),
           ((0x2B, 0x2F, 0x76, 0x38), "UTF_7", "UTF-7"),
           ((0x2B, 0x2F, 0x76, 0x39), "UTF_7", "UTF-7"),
           ((0x2B, 0x2F, 0x76, 0x2B), "UTF_7", "UTF-7"),
           ((0x2B, 0x2F, 0x76, 0x2F), "UTF_7", "UTF-7, Base64 encoded"),
           ((0xDD, 0x73, 0x66, 0x73), "UTF-EBCDIC", "UTF-EBCDIC"),
           ((0x84, 0x31, 0x95, 0x33), "GB-18030", "GB-18030"),
           ((0xF7, 0x64, 0x4C, None), "UTF_8", "UTF-8"),
           ((0xEF, 0xBB, 0xBF, None), "UTF_1", "UTF-1"),
           ((0x0E, 0xFE, 0xFF, None), "SCSU", "SCSU"),
           ((0xFB, 0xEE, 0x28, None), "BOCU-1", "BOCU-1"),
           ((0xFE, 0xFF, None, None), "UTF_16BE", "UTF-16, big-endian"), 
           ((0xFF, 0xFE, None, None), "UTF_16LE", "UTF-16, little-endian")) 
     
    with open(SOURCE, 'rb') as fd:
        (b1, b2, b3, b4) = tuple(map(ord, fd.read(4)))
    for k in BOM:
        if (b1, b2, b3, b4) in k:  # (b1, b2, b3, b4) == k[0]
            encodage, toprint = k[1], k[2]
            break
        elif (b1, b2, b3, None) in k:
            encodage, toprint = k[1], k[2]
            break
        elif (b1, b2, None, None) in k:
            encodage, toprint = k[1], k[2]
            break
    Ce qui donne dans le code:
    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
    #!/usr/bin/python
    #-*- coding: iso-8859-15 -*-
    import sys
    import codecs
    import re
     
     
    BOM = (((0x00, 0x00, 0xFE, 0xFF), "UTF_32BE", "UTF-32, big-endian"),
           ((0xFF, 0xFE, 0x00, 0x00), "UTF_32LE", "UTF-32, little-endian"),
           ((0xF7, 0x64, 0x4C, None), "UTF_8", "UTF-8"),
           ((0xFE, 0xFF, None, None), "UTF_16BE", "UTF-16, big-endian"), 
           ((0xFF, 0xFE, None, None), "UTF_16LE", "UTF-16, little-endian")) 
    SOURCE = 'AvecdesAccents.txt'
     
     
    encodage = sys.getdefaultencoding()
    toprint = "System default encoding (%s)" % encodage
     
    with open(SOURCE, 'rb') as fd:
        (b1, b2, b3, b4) = tuple(map(ord, fd.read(4)))
    for k in BOM:
        if (b1, b2, b3, b4) in k:  # (b1, b2, b3, b4) == k[0]
            encodage, toprint = k[1], k[2]
            break
        elif (b1, b2, b3, None) in k:
            encodage, toprint = k[1], k[2]
            break
        elif (b1, b2, None, None) in k:
            encodage, toprint = k[1], k[2]
            break
    print("Encodage found in bom: %s" % toprint)
    print("Try to decode... (%s)" % toprint)
    with open(SOURCE, 'r') as fd:
        lines = fd.readlines()
    try:
        for line in lines:
            print(line.decode(encodage))
        print("\n")
    except UnicodeDecodeError as e:
        print("UnicodeDecodeError ! (%s)" % toprint)
        print("Raison : %s" % e.reason)
        print("Position : %s\n" % e.start)
    except:
        print("Unexpected error:", sys.exc_info()[0], "\n")
        raise
    print("Try to read with 'codecs'\nContent:")
    with codecs.open(SOURCE, "r", encodage) as fd:
        lines = fd.readlines()
    for line in lines:
        print(line.encode('iso-8859-15'))
    print("Try with 're'")
    for ligne in lines:
        if re.search(u'l.*à' ,ligne):
            print 'il y a des l..à'
        if re.search(u'l à' ,ligne):
            print 'il y a des l à'
    @+

  18. #18
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2011
    Messages : 28
    Par défaut
    Merci pour tous...

    Pour Patrice: hélàs j'ai moi cela ne marche pas...

    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
     
    Microsoft Windows [version 6.1.7601]
    Copyright (c) 2009 Microsoft Corporation. Tous droits réservés.
     
    C:\Users\Utilisateur\Documents>cd Divers
     
    C:\Users\Utilisateur\Documents\Divers>python testlecture.py
    Encodage found in bom: UTF-16, little-endian
    Try to decode... (UTF-16, little-endian)
    UnicodeDecodeError ! (UTF-16, little-endian)
    Raison : truncated data
    Position : 28
     
    Try to read with 'codecs'
    Content:
    Traceback (most recent call last):
      File "testlecture.py", line 47, in <module>
        print(line.encode('iso-8859-15'))
      File "C:\Python27\lib\encodings\iso8859_15.py", line 12, in encode
        return codecs.charmap_encode(input,errors,encoding_table)
    UnicodeEncodeError: 'charmap' codec can't encode character u'\ufeff' in position
     0: character maps to <undefined>
     
    C:\Users\Utilisateur\Documents\Divers>
    J'essaye de comprendre: le but est de déterminer l'encodage du fichier à lire à l'aide de 4 premiers caractères. Un question sans doute idiote: pourquoi le 4 premiers?

    Encore merci.

  19. #19
    Membre Expert
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 952
    Par défaut
    Citation Envoyé par PauseKawa Voir le message
    Pour l'itération une liste ou un tuple serait plus juste, style:
    Merci, c'est noté.

    Un question sans doute idiote: pourquoi le 4 premiers?
    Parce que c'est la première idée qui arrive, la plus logique, la plus simple à implémenter à a comprendre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    UnicodeEncodeError: 'charmap' codec can't encode character u'\ufeff' in position
     0: character maps to <undefined>
    Visiblement, tu a cherché à relire ces 4 premiers octets: Si la routine de PauseKawa a détecté un encodage, il faut bien sûr ensuite les ignorer.

    A+

    Pfeuh

  20. #20
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonjour,

    Citation Envoyé par jingenbl Voir le message
    J'essaye de comprendre: le but est de déterminer l'encodage du fichier à lire à l'aide de 4 premiers caractères. Un question sans doute idiote: pourquoi le 4 premiers?
    A vrais dire à la lecture du sujet la présentation du texte et le þ du début m'ont sembler bizarres, c'est plus clair à partir d'ici:
    Citation Envoyé par mont29 Voir le message
    Hmmm… Le problème vient bien de votre AvecDesAccents.txt, il est bien en latin-1, mais contient de drôles de choses…

    Voici un print “brut” (lecture binaire) de son contenu!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    \xff\xfef\x00i\x00c\x00h\x00i\x00e\x00r\x00 \x00t\x00e\x00s\x00t\x00\r\x00\n\x00 \x00\xe9\x00 \x00\xe0\x00 \x00\xe7\x00 \x00\xe8\x00 \x00\r\x00\n\x00v\x00o\x00i\x00l\x00\xe0\x00!\x00\r\x00\n\x00e\x00t\x00\r\x00\n\x001\x009\x00/\x001\x000\x00/\x002\x000\x001\x002\x00|\x00V\x00o\x00t\x00r\x00e\x00\xa0\x00o\x00r\x00d\x00r\x00e\x00\xa0\x00p\x00e\x00r\x00m\x00a\x00n\x00e\x00n\x00t\x00 \x00-\x00-\x00 \x00S\x00O\x00\xa0\x006\x001\x000\x00-\x008\x000\x005\x008\x000\x004\x004\x00-\x005\x004\x00 \x00B\x00E\x001\x001\x00\xa0\x002\x001\x000\x00\xa0\x000\x004\x006\x003\x005\x005\x009\x00\xa0\x004\x008\x00\xa0\x00M\x00M\x00E\x00 \x00I\x00N\x00G\x00E\x00N\x00B\x00L\x00E\x00E\x00K\x00-\x00O\x00O\x00S\x00T\x00E\x00R\x00L\x00I\x00N\x00C\x00K\x00\xa0\x00B\x00E\x00 \x00C\x00o\x00m\x00:\x00\xa0\x00E\x00P\x00A\x00R\x00G\x00N\x00E\x00 \x00D\x00a\x00t\x00e\x00\xa0\x00v\x00a\x00l\x00e\x00u\x00r\x00:\x00\xa0\x001\x009\x00/\x001\x000\x00/\x002\x000\x001\x002\x00|\x00-\x002\x005\x005\x00,\x001\x001\x00\r\x00\n\x00
    Me demande d’où sortent tous ces caractères NULL*! Une fois supprimés, l’ensemble marche bien pour moi.
    Je me suis dit: les premières valeurs ressembles trop a un bom pour que cela soit innocent.
    Vous remarquerez dans le lien que FF FE (2 bytes) représente de l'utf16le et FF FE 00 00 (4) de l'utf32le. Pour pouvoir définir si c'est de l'utf32 j'ai donc besoin de lire les 4 premiers bytes.
    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
    BOM = (((0x00, 0x00, 0xFE, 0xFF), "UTF_32BE"),
           ((0xFF, 0xFE, 0x00, 0x00), "UTF_32LE"),
           ((0xF7, 0x64, 0x4C, None), "UTF_8"),
           ((0xFE, 0xFF, None, None), "UTF_16BE"), 
           ((0xFF, 0xFE, None, None), "UTF_16LE"))
     
     
    def getbom(f): 
        with open(f, 'rb') as fd:
            (b1, b2, b3, b4) = tuple(map(ord, fd.read(4)))
        for k in BOM:
            if (b1, b2, b3, b4) == k[0]:
                return k[1]
            elif (b1, b2, b3, None) == k[0]:
                return k[1]
            elif (b1, b2, None, None) == k[0]:
                return k[1]
    Et cela semble fonctionner dans votre 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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    import codecs
    import re
     
     
    BOM = (((0x00, 0x00, 0xFE, 0xFF), "UTF_32BE"),
           ((0xFF, 0xFE, 0x00, 0x00), "UTF_32LE"),
           ((0xF7, 0x64, 0x4C, None), "UTF_8"),
           ((0xFE, 0xFF, None, None), "UTF_16BE"), 
           ((0xFF, 0xFE, None, None), "UTF_16LE"))
     
     
    def getbom(f): 
        with open(f, 'rb') as fd:
            (b1, b2, b3, b4) = tuple(map(ord, fd.read(4)))
        for k in BOM:
            if (b1, b2, b3, b4) == k[0]:
                return k[1]
            elif (b1, b2, b3, None) == k[0]:
                return k[1]
            elif (b1, b2, None, None) == k[0]:
                return k[1]
     
     
    sfile = "AvecdesAccents.txt"
    encodage = getbom(sfile)
     
    if encodage:
        # print("Encodage found in bom: %s" % encodage)
        with codecs.open(sfile, "r", encodage) as fd:
            contents = fd.readlines()
    else:
        # print("No encodage found, use source file")
        with open(sfile, 'r') as fd:
            contents = output.read()
     
    for idx, line in enumerate(contents):
        # Je laisse la partie re aux pros
        if re.search(u"là", line):
            print "il y a des là ligne", idx+1
        if re.search(u"é à ç è", line):
            print "il y a des é à ç è ligne", idx+1
    Sortie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    il y a des é à ç è ligne 2
    il y a des là ligne 3
    Pour ce qui est de re il y a des maîtres de l'art sur le sujet et je leurs laissent la place.

    @+

Discussions similaires

  1. Problème accent mysql
    Par staive dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 01/02/2006, 19h11
  2. [C#] Problème accents avec HttpWebRequest
    Par aucean dans le forum C#
    Réponses: 2
    Dernier message: 03/12/2005, 14h40
  3. problème accent sous tomcat
    Par julien_lesbegueries dans le forum Tomcat et TomEE
    Réponses: 5
    Dernier message: 06/10/2005, 14h33
  4. [JDBC]Problème Accent MySQL depuis DB browser dans eclipse
    Par chpruvos dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 26/08/2005, 14h14
  5. [Zip] Problème accent et zip
    Par MrEddy dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 04/06/2004, 11h40

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