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 :

Remplacer les accents dans plusieurs noms de fichiers [Python 2.X]


Sujet :

Python

  1. #1
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2014
    Messages : 13
    Points : 11
    Points
    11
    Par défaut Remplacer les accents dans plusieurs noms de fichiers
    Bonjour,

    Je suis débutante en python.
    Je dois remplacer les accents par des lettres non accentués dans le nom de plusieurs fichiers d'un dossier.
    Pour cela j'ai cherché la réponse sur plusieurs forum, j'en ai trouvé une qui me semblait bonne et je l'ai adapté à mon 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
    import os, re
    wksp = r"C:\stagiaire\Photos" # chemin des photos
     
    def supprime_accent(wksp):
            """ supprime les accents du texte source """
            accents = { 'a': ['à', 'ã', 'á', 'â'],
                        'e': ['é', 'è', 'ê', 'ë'],
                        'i': ['î', 'ï'],
                        'u': ['ù', 'ü', 'û'],
                        'o': ['ô', 'ö'] }
     
            for (char, accented_chars) in accents.iteritems(): # Recuperation des données de accents
                for dirname, subdirs, files in os.walk(wksp):   # Boucle sur chaque fichier du dossier wksp et ses sous-dossiers
                    for nom in files:                           # Recupération de tous les noms de fichiers
                        for accented_char in accented_chars:            # Pour chaque accent
                            nomch = nom.replace(accented_char, char)    # Remplacement dans le nom des accents par les lettres correspondantes
            return nomch
    supprime_accent(wksp)
    print "script ok"
    Or cela ne fonctionne pas aucun de mes noms de fichier est modifié et il n'y a pourtant aucun message d'erreur. Pour trouver le problème j'ai effectué des print à toutes les étapes. Par cette méthode j'arrive à récupérer les noms de mes fichiers, les caractères accentués, les équivalents non accentués. Mais quand je fait print nomch je n'obtiens qu'un nom de fichier.
    Je suis bloquée pourriez-vous m'aider s'il-vous-plaît.

    Merci d'avance pour votre aide.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Pour renommer les fichiers, vous disposez de la fonction rename dans le module os.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    J'ajouterai aussi le module unicodedata

    ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    >>> import unicodedata
    >>> f = u'séjour_à_Dembélé.jpg'
    >>> unicodedata.normalize('NFKD', f).encode('ascii', 'ignore')
    'sejour_a_Dembele.jpg'
    >>>

  4. #4
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2014
    Messages : 13
    Points : 11
    Points
    11
    Par défaut
    Bonjour,

    J'ai essayé d'utiliser la méthode de l'unicode, parce que je ne vois pas comment utiliser le module rename pour renommer 4000 fichiers de noms variés pour ne changer que les accents.
    Voici le script que j'ai fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    import os
    import unicodedata
     
     
    wksp = r"C:\stagiaire\Aude\Photos" # chemin des photos
    def suppr_accent(wksp):
        for dirname, subdirs, files in os.walk(wksp):   # Boucle sur chaque fichier du dossier wksp et ses sous-dossiers
            for nom in files:                           # Recupération de tous les noms de fichiers
                noms = unicode(nom, "utf8", "replace")
                name = unicodedata.normalize('NFD', noms)
        return name.encode('ascii', 'ignore')
     
    suppr_accent(wksp)
    print "script ok"
    Comme pour le précédent script il me marque bien script OK mais lorsque je vais sur mon dossier photo les fichiers possédant des accents dans leur nom ont toujours les accents.
    Je ne comprend pas où est le problème dans mon script.

    Merci pour votre aide.

  5. #5
    Membre éprouvé
    Homme Profil pro
    Aucune activité
    Inscrit en
    Novembre 2011
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune activité

    Informations forums :
    Inscription : Novembre 2011
    Messages : 505
    Points : 926
    Points
    926
    Par défaut
    Citation Envoyé par lyko94 Voir le message
    Bonjour,

    J'ai essayé d'utiliser la méthode de l'unicode, parce que je ne vois pas comment utiliser le module rename pour renommer 4000 fichiers de noms variés pour ne changer que les accents.
    Voici le script que j'ai fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    import os
    import unicodedata
     
     
    wksp = r"C:\stagiaire\Aude\Photos" # chemin des photos
    def suppr_accent(wksp):
        for dirname, subdirs, files in os.walk(wksp):   # Boucle sur chaque fichier du dossier wksp et ses sous-dossiers
            for nom in files:                           # Recupération de tous les noms de fichiers
                noms = unicode(nom, "utf8", "replace")
                name = unicodedata.normalize('NFD', noms)
        return name.encode('ascii', 'ignore')
     
    suppr_accent(wksp)
    print "script ok"
    Comme pour le précédent script il me marque bien script OK mais lorsque je vais sur mon dossier photo les fichiers possédant des accents dans leur nom ont toujours les accents.
    Je ne comprend pas où est le problème dans mon script.

    Merci pour votre aide.

    Bonjour,
    Jusqu'à maintenant, le script récupère le nom des fichiers dans une variable et modifie cette variable.
    => le nom des fichiers sur le disque n'a pas été modifié.
    => utilisation de rename dont le rôle est justement de modifier le nom des fichiers sur le disque…

    Clodion
    PS: Wiztricks s'est donné la peine d'indiquer "LE" lien vers "LA" méthode (non, ce n'est pas un module) considérée. Ce n'est pas pour rien, non?

  6. #6
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Ah ben oui, évidemment.

    Je n'avais pas fait attention à ton premier code.

    Regarde mes commentaires:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        for dirname, subdirs, files in os.walk(wksp):
            for nom in files:                           
                noms = unicode(nom, "utf8", "replace")           # noms est le nom original du fichier
                name = unicodedata.normalize('NFD', noms)       # name est le même nom en ascii
    
                #  .. et puis ? plus rien ?   manque pas quequ'chose ici ?
    
        return name.encode('ascii', 'ignore')        # on retourne le dernier name

  7. #7
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2014
    Messages : 13
    Points : 11
    Points
    11
    Par défaut
    Je n'avais pas vu le lien dans le commentaire de wiztricks désolé.

    J'ai pris en compte vos réponses et j'ai rajouté la fonction rename. Le script me renomme bien mes photos mais lorsqu'il y a une lettre accentuée, il la supprimer et ne me le remplace pas par son équivalent non accentué (ex : Hôpital devient Hpital).
    Voici le script :
    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
    import os
    import unicodedata
     
    wksp = r"C:\stagiaire\Aude\Test" # chemin des photos
     
    def suppr_accent(wksp):
        for dirname, subdirs, files in os.walk(wksp):   # Boucle sur chaque fichier du dossier wksp et ses sous-dossiers
            for nom in files:                           # Recupération de tous les noms de fichiers
                nomini= nom
                noms = unicode(nom, "utf8", "replace")
                name = unicodedata.normalize('NFD', noms).encode('ascii', 'ignore')
                os.rename (wksp + "\\" + nomini, wksp + "\\" + name)
        return "terminé"
     
    suppr_accent(wksp)
    print "script ok"
    Est-ce normal ? Ou y a-t-il encore des erreurs ?

    Merci encore de m'aider.

  8. #8
    Membre éprouvé
    Homme Profil pro
    Aucune activité
    Inscrit en
    Novembre 2011
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune activité

    Informations forums :
    Inscription : Novembre 2011
    Messages : 505
    Points : 926
    Points
    926
    Par défaut
    Citation Envoyé par lyko94 Voir le message
    J'ai pris en compte vos réponses et j'ai rajouté la fonction rename. Le script me renomme bien mes photos mais lorsqu'il y a une lettre accentuée, il la supprimer et ne me le remplace pas par son équivalent non accentué (ex : Hôpital devient Hpital).
    Voici le script :
    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
    import os
    import unicodedata
     
    wksp = r"C:\stagiaire\Aude\Test" # chemin des photos
     
    def suppr_accent(wksp):
        for dirname, subdirs, files in os.walk(wksp):   # Boucle sur chaque fichier du dossier wksp et ses sous-dossiers
            for nom in files:                           # Recupération de tous les noms de fichiers
                nomini= nom
                noms = unicode(nom, "utf8", "replace")
                name = unicodedata.normalize('NFD', noms).encode('ascii', 'ignore')
                os.rename (wksp + "\\" + nomini, wksp + "\\" + name)
        return "terminé"
     
    suppr_accent(wksp)
    print "script ok"
    Est-ce normal ? Ou y a-t-il encore des erreurs ?

    Merci encore de m'aider.
    Bonjour,
    D'où proviennent les erreurs?
    Par exemple, en mettant des "print" un peu partout pour essayer de comprendre où se situe le problème…
    Il y a plein de variables, que valent-t-elles? Sont-elles utiles?
    Si rien n'apparaît, peut-être que rechercher les valeurs des paramètres qui sont transmis aux méthodes serait efficace, non?
    (Ou que l'erreur se trouve ailleurs)

    Clodion

  9. #9
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Essaye comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    wksp = u"C:\stagiaire\Aude\Test" # unicode, pas raw !
     
    def suppr_accent(wksp):
        for dirname, subdirs, files in os.walk(wksp):
            for f in files:
                orig = os.path.join(dirname, f)
                name = unicodedata.normalize('NFD', f).encode('ascii', 'ignore')
                os.rename (orig, os.path.join(dirname, name))

  10. #10
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2014
    Messages : 13
    Points : 11
    Points
    11
    Par défaut
    Clodion j'ai suivi ton conseil et j'ai mis des print pour chacune de mes trois variables, voici ce qu'il me sort :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ID1002-Libération (3).JPG
    ID1002-Lib�ration (3).JPG
    ID1002-Libration (3).JPG
    Il s'agit donc d'une erreur d'encodage visiblement sur la variable
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    noms = unicode(nom, "utf8", "replace")
    Vu que l'accent apparaissait bien dans ma variable nom j'ai tenté de faire ceci :
    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
    import os
    import unicodedata
     
    wksp = r"C:\stagiaire\Aude\Test" # chemin des photos
     
    def suppr_accent(wksp):
        for dirname, subdirs, files in os.walk(wksp):   # Boucle sur chaque fichier du dossier wksp et ses sous-dossiers
            for nom in files:                           # Recupération de tous les noms de fichiers
                nomini= nom
                print nomini
                name = unicodedata.normalize('NFD', nom).encode('ascii', 'ignore')
                print name
                os.rename (wksp + "\\" + nomini, wksp + "\\" + name)
        return "terminé"
     
    suppr_accent(wksp)
    print "script ok"
    Il me retourne l'erreur que la ligne où je défini ma variable name doit être un unicode et pas un str.

    Je suppose donc qu'il faut que je garde ma variable noms. Mais comment résoudre l'erreur alors ?

    Merci encore pour votre aide.

  11. #11
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Regarde le post qui précède le tien.

  12. #12
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2014
    Messages : 13
    Points : 11
    Points
    11
    Par défaut
    Désolé je n'avais pas vu ton poste j'étais en train d'écrire le mien quand il a été posté du coup je ne l'ai pas vu.

    J'ai appliqué les changement que tu as préconisé sur ton poste :
    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
    import os
    import unicodedata
     
    wksp = r"C:\stagiaire\Aude\Test" # chemin des photos
     
    def suppr_accent(wksp):
        for dirname, subdirs, files in os.walk(wksp):   # Boucle sur chaque fichier du dossier wksp et ses sous-dossiers
            for nom in files:                           # Recupération de tous les noms de fichiers
                nomini= os.path.join(wksp, nom)
                name = unicodedata.normalize('NFD', nom).encode('ascii', 'ignore')
                os.rename (nomini, os.path.join(wksp, name))
        return "terminé"
     
    suppr_accent(wksp)
    print "script ok"
    Mais j'ai la même erreur qu'avant c'est-à-dire que dans name ce doit être un unicode et pas un str.

  13. #13
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    J'ai modifié le code qui était inexact
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
                orig = os.path.join(dirname, f)
                name = unicodedata.normalize('NFD', f).encode('ascii', 'ignore')
                os.rename (orig, os.path.join(dirname, name))
    dirname à la place de wksp.

    Par contre tu n'as pas changé la première ligne de ton code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    wksp = u"C:\stagiaire\Aude\Test"
    mets un u à la place du r et tes noms de fichier seront unicode.


    Edit: faudra sans doute échapper les backslashs, moi je suis sous Linux, je n'y pense donc pas toujours.

  14. #14
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2014
    Messages : 13
    Points : 11
    Points
    11
    Par défaut
    Merci VinsS t'a solution marche.

    Merci à tous de m'avoir aidé

    Si jamais d'autres personnes aurait besoin de faire quelque chose de similaire voici le script final :
    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
    import os
    import unicodedata
     
    wksp = u"C:\\stagiaire\\Aude\\Photos" # chemin des photos
     
    def suppr_accent(wksp):
        for dirname, subdirs, files in os.walk(wksp):   # Boucle sur chaque fichier du dossier wksp et ses sous-dossiers
            for nom in files:                           # Recupération de tous les noms de fichiers
                nomini= os.path.join(wksp, nom)
                name = unicodedata.normalize('NFD', nom).encode('ascii', 'ignore')
                os.rename (nomini, os.path.join(wksp, name))
        return "terminé"
     
    suppr_accent(wksp)
    print "script ok"

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 10/03/2010, 15h51
  2. Enlever tous les accents dans le nom d'un fichier
    Par Abou Zar dans le forum Langage
    Réponses: 1
    Dernier message: 13/02/2010, 06h58
  3. comment enlever les accents dans un nom de fichiers ?
    Par clavier12AZQSWX dans le forum Administration système
    Réponses: 6
    Dernier message: 23/09/2009, 06h47
  4. Remplacer les accents dans une chaîne
    Par mathieumg dans le forum C
    Réponses: 9
    Dernier message: 23/07/2006, 15h39
  5. Réponses: 17
    Dernier message: 12/04/2005, 15h28

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