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 :

Unicode, chaîne de caractères et fichier enregistré


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 105
    Par défaut Unicode, chaîne de caractères et fichier enregistré
    Bonsoir,

    J'ai remarqué que vous aviez réponse à tout, donc je vais en profiter pour vous exposer mon petit souci
    Je voudrais pouvoir désaccentuer proprement des textes de plusieurs milliers de caractères pour un comptage...
    Ca, je l'ai en réalité déjà réussi tant que je fonctionne sous l'IDLE de Python 2.6.2.
    Mais dès que j'essaie de "compiler" avec py2exe pour faire fonctionner mon truc en console : il y a certains caractères "spéciaux qui passent à travers, ce qui fausse le comptage et les fréquences...
    Donc, je me suis mis en chasse et j'ai trouvé ça qui fonctionne très bien aussi en console :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
     
    import unicodedata
     
    ligne = u"Cet appareil, pourtant inférieur à celui de Wadsworth, éveilla un vif \ 
    intérêt dans le petit monde des spécialistes. La couronne extérieure est \ 
    divisée en 27 secteurs : les 26 lettres de l'alphabet clair (ordonné) et une \
    case servant de séparation de mots. Le disque intérieur porte un alphabet \
    désordonné de 26 lettres."
     
    ligne =unicodedata.normalize('NFKD', ligne).encode('ascii','ignore')
    print ligne
    Alors direz-vous ?
    Alors, je voudrais pouvoir traiter différents textes enregistrés sur mon disque dur.
    Mais là, ça plante :
    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/env python
    # -*- coding: utf-8 -*-
     
    import unicodedata
     
    fichier=open(rep+'\\Echantillon'+str(i)+'.txt','r')  
     
    for line in fichier:
        line='u'+line.strip('\n','')        
        line=unicodedata.normalize('NFKD', line).encode('ascii','ignore')
     
    Traceback (most recent call last):
      File "C:\VRAC_C\frequence_grammes4.py", line 69, in <module>
        line=unicodedata.normalize('NFKD', 'u'+line).encode('ascii','ignore')
    TypeError: normalize() argument 2 must be unicode, not str
    Je comprends pourquoi, mais je n'arrive pas à faire l'équivalent de ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ligne = u"Cet appareil, pourtant inférieur ..."
    avec un nom de chaîne à la place du texte...

    Si l'un de vous avait l'extrême bonté de prendre 2 min pour me souffler une solution, ce serait vraiment sympa...

    Merci d'avance

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 119
    Par défaut
    file.read retourne une chaîne (str). Si le fichier contient des caractères accentués, ils vont apparaître comme deux caractères car ils sont codés. Pour obtenir la chaîne unicode, il faut donc décoder, et pour cela il faut connaître le codage de la chaîne - souvent utf-8, mais ça dépend de l'éditeur.

    Par exemple u"à" (équivalent à u"\xe0" en unicode) se code en utf-8 '\xc3\xa0'.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    >>> print "\xc3\xa0".encode('UTF-8')
    à
    J'espère que ça répond à la question?

  3. #3
    Membre Expert
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 067
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 067
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ligne =unicodedata.normalize('NFKD', unicode(ligne,'utf-8').encode('ascii','ignore')

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 105
    Par défaut
    Bonjour,

    Comme toujours, quelle réactivité ! Merci.
    @josmiley.
    Il manque une parenthèse après utf-8)
    Cela dit ça marche ensuite, si j'écris :
    [code]#!/usr/bin/env python
    # -*- coding: utf-8 -*-

    import unicodedata
    ligne = u"Cet appareil, pourtant inférieur à celui de Wadsworth, éveilla un vif intérêt dans le petit monde des spécialistes.La couronne extérieure est divisée en 27 secteurs : les 26 lettres de l'alphabet clair (ordonné) et une case servant de séparation de mots. Le disque intérieur porte un alphabet désordonné de 26 lettres."
    Ca a l'air de marcher aussi, à condition que mes fichiers soient enregistrés au format .txt via le bloc-notes mais en utf-8...
    Donc, a priori, c'est bon. Je vais poursuivre mes investigations et vje reviendrai marquer Résolu si c'est bien le cas...

    @Fructidor.
    Non, désolé je n'ai pas été très clair...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ligne = u"Cet appareil, pourtant inférieur à celui de Wadsworth,...
    ici "j'applique" le u directement au contenant u"blabla..."
    Moi je voulais appliquer le u au "conteneur", mais je ne peux pas faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ligne = "Cet appareil, pourtant inférieur à celui de Wadsworth,..."
    print uligne
    Ceci dit ton message m'a permis de comprendre ce que j'avais lu quelque part à propos d caractères spéciaux (3) à écrire en début de ligne : je n'avais pas compris d'où ils sortaient ; là avec mes fichiers enregistrés en UTF-8, je les ai vu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "\xef\xbb\xbfCet appareil,...
    ou encore :
    Apparemment, la méthode de josmiley fonctionne : il doit avoir une grande aptitude à débrouiller ce qui est confus.

    Merci encore

    @+

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 105
    Par défaut
    Re,

    Arf, un doute subit m'a étreint : après vérification ça se confirme !
    Mais c'est inhérent à la méthode et pas à vos réponses :
    le 'ignore' fait que la ligne de transforlation, très normalement, me shunte le "œ"...

    Il ne peut évidemment pas me le remplacer par oe, tout comme son compère ne peut pas être remplacé par ae...

    Y a-t-il un moyen autre que de parcourir visuellement tous les fichiers à la recherche de ces deux exceptions ?

    @+

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 699
    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 699
    Par défaut Hmmm
    De toutes façon, il faut savoir comment est encodé le fichier.
    Mais pourquoi ne pas faire faire les conversions 'plus bas' en utilisant 'codecs'?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    from codecs import open
    fichier = open('fichier.txt', encoding='utf8')
    for ligne in fichier:
        #...
    -W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. Réponses: 0
    Dernier message: 15/11/2011, 15h42
  2. Exports de chaînes de caractère dans fichier texte
    Par Stormy31 dans le forum Langage
    Réponses: 4
    Dernier message: 29/01/2009, 13h31
  3. Réponses: 8
    Dernier message: 16/06/2006, 01h06
  4. Rechercher une chaîne de caractère dans une série de fichier
    Par Edoxituz dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 28/02/2006, 12h51

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