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 :

[string] Sans accents


Sujet :

Python

  1. #1
    Invité
    Invité(e)
    Par défaut [string] Sans accents
    Bonjour,

    Je souhaite manipuler des fichiers texte mais auparavant j'aimerai les copiers et les transformer. Je dois passer le texte en minuscule, supprimer les caractère spéciaux, les espaces et transformé les caractères accentués en caractères non accentués. C'est cette dernière étape qui me bloque :

    Pour le moment j'ai ca :

    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
    def Lire_Fic_Text(self,source,destination):
    		fs = open(source, 'r')
    		fd = open(destination, 'w')
    		while 1:
    			txt = fs.readline()
    			if txt =='':
    				break
    			if txt[0] != '':
    				txt = txt.replace(' ','')
    				txt = txt.lower()
    				txt = ''.join(u for u in txt if u in ascii_letters)
    				txt = self.Enleve_Accents(txt)
    				fd.write(txt)
    		fs.close()
    		fd.close()
    A quoi doit ressembler ma méthode Enleve_Accents(fichier.txt) pour cela ? Merci

    PS : En plus d'ouvrir mon fichier pour lire le texte qu'il contient, je voudrais aussi l'ouvrir pour lire octet par octet, y a t-il une méthode particulière autre que open(fic,mode)?

  2. #2
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 465
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 465
    Points : 9 257
    Points
    9 257
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Solution possible:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    def Enleve_Accents(txt):
        ch1 = u"àâçéèêëîïôùûüÿ"
        ch2 = u"aaceeeeiiouuuy"
        s = ""
        for c in txt:
            i = ch1.find(c)
            if i>=0:
                s += ch2[i]
            else:
                s += c
        return s
    Ce n'est pas une méthode très subtile, mais ça marche assez bien.

    Exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    txt = u"zjciéoèçàfdùô"
    print Enleve_Accents(txt)
    zjcieoecafduo
    On peut adapter ch1 et ch2 pour traiter aussi des majuscules accentuées.

    Tyrtamos
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 222
    Points : 290
    Points
    290
    Par défaut
    bonjour,

    tu peux utiliser le module unicodedata. Voici un exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    # -*- coding: utf-8 -*-
     
    import unicodedata
     
    chaine = u"mà chàîne âvèc dès càräctère spéciâüx"
     
    chaine = unicodedata.normalize('NFKD', chaine).encode('ASCII', 'ignore')
    print chaine

  4. #4
    Invité
    Invité(e)
    Par défaut
    Je viens d'essayer, et effectivement, celle avec unicodedata m'a l'air bonne. Merci donc.

    Siriru

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 22
    Points : 16
    Points
    16
    Par défaut
    Bonjour, j'ai actuellement plus ou moins le même problème. Je souhaite cependant que la chaine reste en unicode (et pas en ascii). En fait, je souhaite simplement comparer deux chaines unicode en ignorant les accents. Des idées ?

    Cordialement,
    MB.

  6. #6
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 465
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 465
    Points : 9 257
    Points
    9 257
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Avec la solution unicodedata ci-dessus, on peut repasser la chaine en unicode en ajoutant simplement .decode('ASCII') à la formule.

    Cette solution passant par ascii est un peu brutale. Selon le problème à résoudre, elle peut l'être trop. Par exemple elle fait disparaître (sans message) certains caractères de la langue française comme 'æ', 'œ' ou même le signe euros '€'.

    Pour un contrôle au caractère près, on devrait pouvoir adapter mon code ci-dessus. Sinon, unicodedata devrait aller.

    Tyrtamos
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 22
    Points : 16
    Points
    16
    Par défaut
    Merci, ça devrait aller comme ça.
    J'ai recherché une fonction qui permettrait de comparer directement deux chaines en ignorant les caractères accentués, mais on dirait que ça n'existe pas.

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

Discussions similaires

  1. Faire une recherche avec/sans accents
    Par Wedge3D dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 21/02/2007, 10h43
  2. [C#][debutant] tableau String sans donner la taille ?
    Par Sylk dans le forum Windows Forms
    Réponses: 4
    Dernier message: 29/11/2005, 20h42
  3. [C#] Convertir une chaine accentue => sans accents
    Par alex57 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 07/09/2005, 09h21
  4. [Debutant][String]Supprimer accents
    Par TylerKnoxx dans le forum API standards et tierces
    Réponses: 5
    Dernier message: 06/09/2005, 14h48
  5. Fichiers texte sans accents
    Par mika dans le forum Langage
    Réponses: 5
    Dernier message: 03/11/2004, 16h42

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