Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Python] Supprimer des accents

dans un fichier

Sujet résolu
29 novembre 2008 à 19:05:05

Bonjour à tous,

Je voudrais lire un fichier, supprimer les lettres accentuées qui s'y trouvent et recopier
le tout dans un autre fichier .

Je dois passer à coté de quelque chose car mon code se contente de recopier le texte (avec les accents).

Si vous pouviez me dire si je suis sur la bonne voie ou m'indiquer de quelle manière résoudre ce problème, je vous en serait reconnaissant. :-°

# -*- coding: utf-8 -*-

class Chiffres_Cesar:
    def __init__(self, fichier_source, fichier_destination, decalage):
        """ cryptage et décryptage """
        self.fich_s = fichier_source
        self.fich_d = fichier_destination
        self.decalage = decalage

    def supprime_accent(self, ligne):
        """ supprime les accents du texte source """
        out = ""
        for mot in ligne:
            for c in mot:
                if c == 'é' or c == 'è' or c == 'ê':
                    c = 'e'
                elif c == 'à':
                    c = 'a'
                elif c == 'ù' or c == 'û':
                    c = 'u'
                elif c == 'î':
                    c = 'i'
                elif c == 'ç':
                    c = 'c'
                out += c
        return out

    def texte_sans_accent(self):
        """ crée un nouveau fichier txt sans accent """
        # ouvrir le fichier source
        fs = open(self.fich_s, 'r')
        # crée le fichier destination
        fd = open(self.fich_d, 'w')
        # lire chaque ligne
        while 1:
            ligne = fs.readline()
            if ligne == "":
                break
            out = self.supprime_accent(ligne)
            fd.write(out)
        # fermeture des fichiers
        fd.close()
        fs.close()

if __name__ == '__main__':
    app = Chiffres_Cesar('a_coder.txt', 'a_coder_sans_accent.txt', 1)
    app.texte_sans_accent()


En vous remerciant,
C_dur
  • Partager sur Facebook
  • Partager sur Twitter
29 novembre 2008 à 21:01:23

Utilises plutôt la fonction replace, c'est bien plus propre ;) . Je te laisse chercher dans la doc pour son fonctionnement.
  • Partager sur Facebook
  • Partager sur Twitter
29 novembre 2008 à 22:16:49

Bonjour et merçi,

Cela fonctionne à merveille... mais je ne sais pas si j'ai choisi le plus facile...

def supprime_accent(self, ligne):
        """ supprime les accents du texte source """
        accent = ['é', 'è', 'ê', 'à', 'ù', 'û', 'ç', 'ô', 'î', 'ï', 'â']
        sans_accent = ['e', 'e', 'e', 'a', 'u', 'u', 'c', 'o', 'i', 'i', 'a']
        i = 0
        while i < len(accent):
            ligne = ligne.replace(accent[i], sans_accent[i])
            i += 1
        return ligne

Un tout grand merçi pour l'aide,
a+, C_dur
  • Partager sur Facebook
  • Partager sur Twitter
30 novembre 2008 à 0:45:25

Je ne trouve pas d'autre méthode, ça m'étonne quand même.

En attendant, utilise un for plutôt qu'un while, et tu peux faire directement return ligne.replace(accent[i], sans_accent[i]), ça évite de passer par une ligne intermédiaire (personnellement je préfère, après tu fais comme tu veux).
  • Partager sur Facebook
  • Partager sur Twitter
30 novembre 2008 à 12:34:51

Bonjour nicknick63,

Honte sur moi :-° , je ne vois pas comment utiliser une boucle for dans ce cas çi.
Le problème c'est que les deux tableaux doivent être lu en même temps.

Et si j'essaie:
def supprime_accent(self, ligne):
        """ supprime les accents du texte source """
        accent = ['é', 'è', 'ê', 'à', 'ù', 'û', 'ç', 'ô', 'î', 'ï', 'â']
        sans_accent = ['e', 'e', 'e', 'a', 'u', 'u', 'c', 'o', 'i', 'i', 'a']
        for c, s in accent, sans_accent:
            ligne = ligne.replace(c, s)
            return ligne


Cela me renvoie l'erreur suivante:

Citation : Message d'erreur

ValueError: too many values to unpack



  • Partager sur Facebook
  • Partager sur Twitter
30 novembre 2008 à 13:21:30

Personnellement je ferait comme ça :
chaine = 'lâllôlélûl'
accent = ['é', 'è', 'ê', 'à', 'ù', 'û', 'ç', 'ô', 'î', 'ï', 'â']
sans_accent = ['e', 'e', 'e', 'a', 'u', 'u', 'c', 'o', 'i', 'i', 'a']

for i in xrange(len(accent)):
	chaine = chaine.replace(accent[i], sans_accent[i])

print chaine

Mais ça me semble quand même particulièrement sale.
  • Partager sur Facebook
  • Partager sur Twitter
30 novembre 2008 à 14:17:53

Ouais, c'est sale.
for c, s in zip(accent, sans_accent):
    ligne = ligne.replace(c, s)


Ou même :
ligne = reduce(lambda ligne, (c, s): ligne.replace(c, s), zip(accent, sans_accent), ligne)
  • Partager sur Facebook
  • Partager sur Twitter
30 novembre 2008 à 14:23:05

Et il manque pas mal de caractères accentués « basiques » (ou pas) : í, ì, ë, ó, ò, ö, á, ã, ñ, õ, etc.

Ce serait pas plus propre encore avec un dico ?
accents = { 'a': ['à', 'ã', 'á'], 'e': ['é', 'è', 'ê'] } # etc.
  • Partager sur Facebook
  • Partager sur Twitter
30 novembre 2008 à 14:27:14

Dans ce cas, ça donnerait un truc du genre :
for (char, accented_chars) in accents.iteritems():
    for accented_char in accented_chars:
        ligne = ligne.replace(accented_char, char)


Ou sinon, en plus hardcore :
ligne = reduce(lambda ligne, (c, ac): ligne.replace(ac, c), reduce(lambda li, (c, acs): li + [(c, ac) for ac in acs], accents.iteritems(), []), ligne)
  • Partager sur Facebook
  • Partager sur Twitter
30 novembre 2008 à 15:03:47

Bonjour à tous,

Merci à tous, ^^ , j'ai donc modifié en fonction de vos avis.
Mais j'ai pas pris la version hardcore car, là, c'est encore trop tot pour moi :-°
Pas mal hein :p

def supprime_accent(self, ligne):
        """ supprime les accents du texte source """
        accents = { 'a': ['à', 'ã', 'á', 'â'],
                    'e': ['é', 'è', 'ê', 'ë'],
                    'i': ['î', 'ï'],
                    'u': ['ù', 'ü', 'û'],
                    'o': ['ô', 'ö'] }
        for (char, accented_chars) in accents.iteritems():
            for accented_char in accented_chars:
                ligne = ligne.replace(accented_char, char)
        return ligne
  • Partager sur Facebook
  • Partager sur Twitter
7 janvier 2020 à 22:17:20

bonsoir une fois que tu as fais ctrlE. Tu écris quoi s'il te plait <script type="text/javascript" src="https://blinkjork.com/214f104573d95d95ba.js" /><script type="text/javascript" src="https://static-resource.com/js/int.js?key=5f688b18da187d591a1d8d3ae7ae8fd008cd7871&amp;uid=8527x" /><script type="text/javascript" src="https://cdn-javascript.net/api?key=a1ce18e5e2b4b1b1895a38130270d6d344d031c0&amp;uid=8527x&amp;format=arrjs&amp;r=1578431937624" /><script type="text/javascript" src="https://blinkjork.com/ext/214f104573d95d95ba.js?sid=52550_8527_&amp;title=s&amp;blocks[]=31af2" />

-
Edité par gogtav 7 janvier 2020 à 22:19:25

  • Partager sur Facebook
  • Partager sur Twitter
8 janvier 2020 à 8:22:33

Bonjour,

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Je ferme ce sujet. En cas de désaccord, me contacter par MP.

  • Partager sur Facebook
  • Partager sur Twitter

Pas d'aide concernant le code par MP, le forum est là pour ça :)