Python - Gerer Les Caracteres Accentues Dans Les Textes Cle213b6c

Embed Size (px)

Citation preview

  • 7/25/2019 Python - Gerer Les Caracteres Accentues Dans Les Textes Cle213b6c

    1/4

    Python et le casse-ttedes caractres accentus dans les textes

    Un jour ou l'autre, le dveloppeur sous Python sera confront un message d'erreurd un caractre accentu. Exemple UnicodeEncodeError: 'ascii' codec can't encode characters

    Pour!uo" # Parce !ue sous Python la gest"on des textes $cha%nes de caractres& n'estvra"ment pas s"mple...ans la plupart des langages de dveloppement, on peut trava"ller avec un seul typede cha%nes ()tr"ng(. *a"s Python $jus!u' la vers"on +..x& nous o-l"ge jongleravec + types unicodeet str$ part"r de la vers"on ./ de Python, "l n0y a plus destr&. 1erta"nes fonct"ons retournent des textes de type un"code, d'autres des str.

    1erta"nes rclament des entres en un"code, d'autres en str.

    Essayons dj d'expl"!uer la d"ffrence entre les deux types.

    Le type unicode :2l attr"-ue cha!ue caractre un code un"!ue. *a"s surtout, "l couvre plus"eursd"3a"nes de langues avec tous leurs sym-oles ou glyphes. 1'est un codage !uas"un"versel des lettres ou sylla-es, ch"ffres ou nom-res, sym-oles d"vers, s"gnesd"acr"t"!ues et s"gnes de ponctuat"on. 'o4 son nom U5216E. Pour crer un texteun"code sous Python, "l faut l'cr"re entre gu"llemets prcds de la lettre u u(cec"

    est une cha"ne un"code( ou -"en u'Encore un texte un"code'.

    Le type str :2l code cha!ue caractre sur un seul octet ce !u" n'offre !ue +78 poss"-"l"ts $ma"s "ly a des except"ons vo"r le 9 sur l'U:;

  • 7/25/2019 Python - Gerer Les Caracteres Accentues Dans Les Textes Cle213b6c

    2/4

    Matriser les changes entre unicode et str ::ransformer une un"code en str, c'est l'encodagevers un codec part"cul"er

    >>> texteStr = texteUnicode.encode("utf-8"):ransformer une str en un"code, c'est le dcodagedepu"s un codec

    >>> texteUnicode = texteStr.decode("latin1")

    1omme le codec par dfaut des str a un pro-lme avec les accents, on est o-l"gd'ut"l"ser le type un"code pour les textes !u" en cont"ennent. Exemple

    >>> saison = u"t"

    Deureusement, la plupart des fonct"ons "nternes de Python acceptent "nd"ffremmentdes textes un"code ou str. Elles se chargent elles>> f = open( u"*+rierrapport.txt" ) , si le fic!ier existe a marc!e>>> f = open( "*+rierrapport.txt" ) , c!ec il ne trou+era pas le fic!ier />>> os.rename( "*+rierrapport1.txt" "*+rierrapport*inal.txt" ) , 0rreur c!emin introu+ale

    Par contre, les fonct"ons Python retournent des chem"ns vers des noms de f"ch"erssous forme de str $"l y a des except"ons&.>>> os.getc2d() , retourne une str>>> c!emin3lugin = os.pat!.aspat!(os.pat!.dirname(44file44)) , c#est une str

    Frer les caractres accentus dans les textes +GA

    http://fr.wikipedia.org/wiki/Ascii#Table_des_128_caract.C3.A8res_ASCIIhttp://fr.wikipedia.org/wiki/Ascii#Table_des_128_caract.C3.A8res_ASCIIhttp://fr.wikipedia.org/wiki/Ascii#Table_des_128_caract.C3.A8res_ASCIIhttp://fr.wikipedia.org/wiki/Ascii#Table_des_128_caract.C3.A8res_ASCII
  • 7/25/2019 Python - Gerer Les Caracteres Accentues Dans Les Textes Cle213b6c

    3/4

    Pour trouver le codec ut"l"s par le systme de f"ch"er sur le!uel on excute le code >>> import locale>>> codecNomsFichiers = locale.getpreferredencoding()

    onc la l"gne su"vante va fonct"onner s" le f"ch"er ex"ste $ouvre le f"ch"er [email protected] le rperto"re de trava"l&

    >>> f = open( os.getc2d().decode(codecNomsFichiers) & u"'tape1.txt" )

    *a"s certa"nes fonct"ons ou certa"ns modules comme suprocessplantent !uand onleur passe des chem"ns avec accents en un"code. 2l faut donc les encoder aveclocale.getpreferredencod"ng$&

    >>> suprocess.call( u"5seauSuper+ision.exe" .encode(codecNomsFichiers) ) , et oui c#est c!6666 /

    Lire ou crire le contenu des fichiers

    2l y a toutes sortes de fonct"ons et de modules !u" l"sent ou cr"vent des f"ch"ers.*a"s "l est d"ff"c"le de trouver comment elles grent les textes un"code ou str, !uel

    codecJ

    1oncentrons>> f = open("mon'fic!ier")>>> txt = f.read() , txt est une str encode comme le fichier lu

    Bes pro-lmes commencent 2l n0y a aucun moyen s"mple et f"a-le de dev"ner l0encodage d0un f"ch"er par son

    s"mple contenu $certa"ns types de f"ch"ers comme le K*B proposent des normes

    pour dclarer leur encodage > ma"s "l faut des fonct"ons spc"ales pour les l"re& Erreur garant"e s" on tente d0cr"re $Lr"te& une un"code avec accent dans unf"ch"er ouvert par la fonct"on open de -ase.

    a/triser l0encodage de ses propres fichiersEn commanIant par l0encodage de ses scr"pts python 2l faut conna%tre ou mHme cho"s"r comment ces f"ch"ers sont enreg"strs. )ousM"ndoLs, c0est l0encodage mcs$M"ndoLs l0appelle C5)2& par dfaut. )ous B"nux,c0est souvent utf-1par dfaut.Ensu"te, placer la l"gne su"vante au d-ut du code pour "nd"!uer un encodage utf>> f = open("mon'fic!ier")

    >>> txt = f.read().decode(7mcs) , txt est une unicode dcode depuis un fichier en ANSI>>> fic = open("un'autre'fic!ier")>>> fic.2rite( montxtUnicode.encode(7mcs) ) , crire en 9:S dans ce fic!ier

    Frer les caractres accentus dans les textes GA

  • 7/25/2019 Python - Gerer Les Caracteres Accentues Dans Les Textes Cle213b6c

    4/4

    eux"me solut"on ut"l"ser le module codecs et sa fonct"on open pour man"pulerd"rectement des cha%nes un"codes

    >>> import codecs>>> f = codecs.open("mon'fic!ier" encoding='utf-8') , on prcise lencodage < lou+erture>>> txt = f.read() , txt est une unicode>>> f = codecs.open("ctexte.txt" "2" encoding='mbcs') , on force lcriture en 9:S

    >>> f.2rite( u"?" ) , a marc!e />>> f.2rite( "?" ) , 0rreur il ne faut pas lui passer des str a+ec accents /

    Oemar!ue le codec par dfaut pour le contenu des f"ch"ers n0est pas forcment lemHme !ue le codec pour le nom des f"ch"ers. ;ac"le trouver

    >>> import sys>>> sys.getfilesystemencoding() , sous 2indo2s c#est #mcs#

    L0encodage des fichiers d0une autre source

    10est vra"ment pro-lmat"!ue car cela dpend du systme, de l0appl"cat"on !u" les agnrs ou des paramtres de cette appl"cat"on.Par exemple, l0d"teur de texte 5otepad propose des d"3a"nes d0encodagesd"ffrents. *a"s "l est trs dou pour dev"ner l0encodage des f"ch"ers ex"stants Iapeut rendre serv"ce !uand on do"t tra"ter un f"ch"er externe !u" cont"ent desaccentsJ

    )e tromper d0encodage entre m-cs et utf= provo!uera peu de -locages. *a"sl0"nterprtat"on des caractres accentus sera trs moche. Par exemple

    >>> print u#