Vérifier et modifier des noms de fichiers en Python

Le problème exposé dans ce sujet a été résolu.

Bonjour à tous,

Je bosse actuellement sur un petit script pour mon boulot pour vérifier les noms des fichiers dans le repertoire en cours du script pour:

  • Vérifier qu’il n’y a pas d’accent dans les noms
  • Vérifier qu’il n’y a pas d’accent

Si c’est le cas modifier le nom du fichier

Hors je bloque à l’étape de remplacement dans ma chaine de character

j’ai ce code et il ne remplace pas les accent alors que j’utilise bien str.replace(ancien,nouveau)

# coding: utf-8
import os

liste = os.listdir()
for elt in liste:
    chaine=str(elt)
    if "é" in chaine:
        print("trouve : "+elt)
        chaine.replace("é", "e")
        print(chaine)
    elif "è" in chaine:
        print("trouve : "+elt)
        chaine.replace("è", "e")
    elif " " in chaine:
        print("trouve : "+elt)
        chaine = chaine.replace(" ", "_")
    else:
        print("pas trouvé "+ elt)
    
os.system("pause")

Cependant ce code ne remplace pas mes accents et là je n’arrive pas à voir mon erreur :o

PS: oui je sais que la partie "modification nom fichier" n’est pas implémenté mais je me suis arrété quand j’ai vu que même dans le retour print() ça n’allait pas

Merci par avance pour votre aide :D

+0 -0

Salut, outre la question soulevée par SpaceFox, je vois plusieurs problèmes dans ton bout de code.

  • Les chaînes de caractères sont des objets immuables, leur méthode replace ne les modifie pas mais renvoie une nouvelle chaîne modifiée.
  • Avec ta batterie if/elif, si tu rentres dans un tu ne testeras pas les suivants, donc tu ne pourras remplacer qu’un type de caractères.
  • os.system("pause") ?
  • Tu comptes ajouter un if pour chaque caractère accentué possible ? Avec ses différentes formes ? Tu fais quoi des autres caractères unicode ?
  • elt est-il toujours de type string ? Si oui (il me semble que c’est le cas), quelle est l’utilité de la ligne 6 ? Sinon, tes print avec concaténation risquent de planter (print permet d’ailleurs de recevoir plusieurs arguments, pas besoin de concaténer les chaînes en entrée).

Si vraiment tu tiens à te limiter aux caractères ASCII, j’utiliserais la fonction normalize du module unicodedata avec une forme NKFD, pour ensuite filtrer et ne garder que les caractères ASCII.

>>> ''.join(c for c in unicodedata.normalize('NFKD', 'éfilé') if c in string.printable)
'efile'

Si vraiment tu tiens à te limiter aux caractères ASCII, j’utiliserais la fonction normalize du module unicodedata avec une forme NKFD, pour ensuite filtrer et ne garder que les caractères ASCII.

entwanne

Tout en sachant que si tu as un caractère qui n’est pas un « dérivé » d’un caractère ASCII, il sera tout simplement supprimé. Ce qui peut apporter des blagues du style « ce fichier n’a plus de nom ».

Quelle raison peut-on avoir en 2019 d’interdire les accents dans les noms de fichier ?!

SpaceFox

Ils vont partir dans un S3 amazon et du coup leur URL contiendra des gines accentués dans uen URL c’est pas terrible.

Mais du coup normalize ça m’a l’air mieux que ma solution mais comment faire pour normaliser sans perdre ? C’est la meilleur solution ?

Oui en effet, après il peut choisir d’en faire autre chose comme le remplacer par une séquence d’échappement.

Sinon, en me repenchant sur ton code je vois aussi que tu pourrais utiliser la pathlib pour bénéficier des méthodes iterdir et rename.

Mais du coup normalize ça m’a l’air mieux que ma solution mais comment faire pour normaliser sans perdre ?

alliocha1805

Vu ce que tu cherches à faire tu auras forcément des pertes (puisque tu veux faire disparaître les diacritiques), et donc potentiellement des conflits entre les noms.

Ils vont partir dans un S3 amazon et du coup leur URL contiendra des gines accentués dans uen URL c’est pas terrible.

alliocha1805

Ça n’est absolument pas un problème. Wikipedia n’utilise que ça, des caractères non-ASCII dans les URLs.

(PS : en vrai c’est urlencodé, mais normalement c’est invisible pour l’utilisateur final).

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte