Renommer ses répertoires et ses fichiers en masse avec un script Python

Je viens de terminer un programme en Python qui m’a donné bien du fil à retordre. Mais au bout du compte, je suis très satisfait du résultat car le code effectue exactement ce que je voulais. Ce programme renomme en masse automatiquement tous les fichiers et répertoires qui ont dans leur nom, des espaces, des apostrophes ou des lettres avec des diacritiques utilisées en français et en allemand. Par exemple, un fichier nommé Hôtel de ville de L’Haÿ-les-Roses.png va être renommé :

Hotel_de_ville_de_L_Hay-les-Roses.png

Pour votre gouverne personnelle, sachez que L’Haÿ-les-Roses partage avec trois autres communes françaises la très rare particularité d’avoir un nom comportant un ÿ. Les trois autres communes sont Moÿ-de-l’Aisne, Faÿ-lès-Nemours et Aÿ-Champagne. Autre exemple, voici ce que je viens de créer :

Les noms des répertoires et du fichier représentant Loui XVI, sauvagement décapité il y a 229 ans jour pour jour, sont bourrés de signes diacritiques. J’exécute mon programme Python en lui passant un paramètre qui est le chemin absolu du répertoire à analyser. Compte tenu du fait que ce dernier contient un espace, je l’entoure de guillemets.

./rename_files  "/home/benoit/Benoît Miamondo"

Et voici le résultat obtenu instantanément :

Benoit_Miamondo, zbiF_sfe, aeeoe, fYjac, Caeei_gc.png

Plus aucun espace, plus aucune diacritique ou apostrophe! L’idée m’est venue de coder ce programme en voyant les noms de fichiers et répertoires de ma compagne. Il y avait des espaces, des apostrophes et des accents de toutes sortes.

Or, il faut savoir que ce genre de fantaisie n’est pas conseillé. Pourquoi? Parce qu’un script Bash qui a besoin du nom du répertoire en paramètre, va découper Cours de francais en trois paramètres et le script ne s’exécutera pas. Exemple, voici un script qui se contente d’afficher ses paramètres dans la console.

 #!/bin/bash

 # Nom du script : script.sh 

 echo $1

Je l’exécute:

./script.sh  Cours de français

Résultat : Cours

Ce n’est pas ce que je voulais… En fait, sous Unix, un espace est interprété comme un séparateur. Pour éviter ce genre de désagrément, vous avez deux possibilités:

  • Utiliser des guillemets mais il s’agit d’une intervention manuelle que l’ordinateur ne fera pas à votre place.
./script.sh  "Cours de français"

Résultat : Cours de français

  • Renommer le répertoire Cours_de_francais et le problème est résolu.
./script.sh  Cours_de_francais

Résultat : Cours_de_francais

C’est la meilleure solution. Veuillez noter également que la lettre ç (tout comme les autres lettres avec un signe diacritique) n’est pas une bonne idée. Il vaut mieux se contenter de lettres normales et de quelques caractères standard tels que le tiret bas par exemple. En revanche, les majuscules ne posent pas de problème. Voici donc comment il aurait fallu nommer le répertoire :

Cours_de_francais

Le programme en Python rename_files.py

Analysons le code de mon programme ensemble. Il se divise en trois parties:

  1. Le dictionnaire de lettres comportant des signes diacritiques en français et en allemand,
  2. la collecte de tous les fichiers et répertoires qu’il va falloir renommer,
  3. le renommage avec shutil.move().

Mon programme prend obligatoirement un argument, à savoir le chemin absolu du répertoire qui sera parcouru de manière récursive. Dans ce cas, toutes les lettres avec un signe diacritique, un espace ou une apostrophe que l’on trouve dans les clés du dictionnaire Letters, seront remplacées par leurs valeurs respectives.

./rename_files.py  /home/benoit/Documents

Si vous voulez ne remplacer qu’une seule lettre, par exemple le é par e, voici comment il faut exécuter le script :

./rename_files.py  /home/benoit/Documents  é  e

Si vous voulez remplacer les apostrophes par des tirets bas, il faut « échapper » l’apostrophe.

./rename_files.py  /home/benoit/Documents  \'  _

Et si le chemin absolu du répertoire à parcourir contient un espace, alors il faut utiliser les guillemets.

./rename_files.py  "/home/benoit/Documents/Codes  Python"    # Remplacement de toutes les clés du dictionnaire par leurs valeurs
./rename_files.py  "/home/benoit/Documents/Codes  Python"  "  "  _      # Remplacement des espaces par un tiret bas

Petite précision qui a son importance :

Ne vous amusez pas à exécuter ce script en tant que root pour parcourir les fichiers système car votre ordinateur risque de ne pas trop apprécier ce genre d’excentricité.

Quelle a été la partie du code la plus difficile?

Le renommage proprement dit, car en parcourant un répertoire de manière récursive, vous êtes dans une boucle. Vous commencez par renommer le premier répertoire et déjà les problèmes commencent… Tous les chemins des sous-répertoires et fichiers ne correspondent plus aux chemins que vous avez collectés dans la liste paths. shutil.move() les a modifiés! Par conséquent, à chaque tour de boucle, il faut prendre soin de modifier par anticipation, dans la liste paths, tous les répertoires parents pour que leurs nouveaux noms correspondent à ce que shutil.move() a modifié! Donc, si cette partie du code vous semble obscure, sachez que c’est le cas pour moi également!

3 commentaires sur « Renommer ses répertoires et ses fichiers en masse avec un script Python »

  1. Bravo Benoît.
    Pour ma part je me refuse à renommer ces fichiers car c’est encore une concession à l’américain (langue d’origine des langages de programmation). je prèfère un script qui mettra de lui-même des apostrophes ou des guillemets mais respectera l’orthographe et les séparateurs choisis.
    Python est assez bien pourvu pour cela. Par contre je crains bien que Windows reste longtemps réfractaire. C’est pourquoi j’ai choisi Linux et UTF8.

    J’aime

  2. Je dois dire aussi que j’écris en trois langues : Français, Roumain et Anglais. Si pour les anglo-américains les diacritiques, les accents et la ponctuation sont de simples « décorateurs » pour de futures langues mortes, je considère au contraire que les lettres accentuées, les diacritiques et une ponctuation sérieuse sont aussi importants que les lettres dans une orthographe précise. Or avec UTF8 l’informatique est parfaitement capable de respecter cette précision, depuis qu’on a remisé aux antiquités le code ANSI des premiers ordinateurs. Ce n’est que par paresse et par manque de culture que beaucoup de programmes n’ont pas encore été actualisés et exigent que les noms de fichiers continuent de se conformer aux anciennes limitations.

    J’aime

    1. Bonjour Jef,
      Merci pour votre commentaire. Dans le contenu d’un document, si les accents français manquent, cela va m’agacer. Je suis assez traditionnel sur ce point. Pour les fautes grossières, c’est pareil. Il y a quelques jours, j’ai lu : « Je me pause des questions ». L’auteur de cette lamentable faute a eu droit à une réflexion de ma part. On ne peut pas tout mettre sur le dos de la dysorthographie. En revanche, le nommage des fichiers est, pour moi, quelque chose de purement technique sans aucun rapport avec la littérature. Je n’ai donc pas vergogne à tous les supprimer.
      Cordialement.

      J’aime

Votre commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l’aide de votre compte WordPress.com. Déconnexion /  Changer )

Image Twitter

Vous commentez à l’aide de votre compte Twitter. Déconnexion /  Changer )

Photo Facebook

Vous commentez à l’aide de votre compte Facebook. Déconnexion /  Changer )

Connexion à %s