Problème de renommage fichiers (Maj et Min) avec code Python

Fermé
Ninja - Modifié le 24 juil. 2023 à 10:39
Whismeril Messages postés 19144 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 24 septembre 2024 - 12 juil. 2023 à 22:35

Bonjour,

Je vous fais une description rapide de ce que je souhaite faire, je dois renommer en masse des fichiers pour faire des DOE à l'aide de python en utilisant un fichier source Excel.

J'ai défini un format spécifique à respecter sur le fichier source Excel, sauf que Python ne fait pas la différence entre les majuscules et les minuscules de l'ancien format et du nouveau format. Voici un exemple pour mieux illustrer la situation :

  •  Ancien nom : PLANMAJ_Exemple-01
  •  Nouveau nom : PlanMaj_Exemple-01

Je précise que c'est le format le plus basique d'un nom de fichier que je peux avoir, j'ai des noms très variables et longs mais la clé qui me permet de retrouver le fichier est ce numéro unique "Exemple-01".

Le code considère que ça existe déjà et donc il ignore ce fichier et garde l'ancien nom. 

Je vous partage le code que j'ai généré avec ChatGPT (je ne suis pas du tout informaticien, je me fait aider l'IA pour avancer sur mes tâches :) ) :

import pandas as pd
import os

# Chemin du dossier contenant les fichiers à renommer
dossier = r"Chemin de mon dossier"

# Chemin vers le fichier Excel contenant les correspondances de noms de fichiers
chemin_fichier_excel = r"Chemin de mon dossier"

# Lire le fichier Excel
df = pd.read_excel(chemin_fichier_excel)

# Parcourir chaque ligne du fichier Excel et renommer les fichiers
for index, row in df.iterrows():
    ancien_nom_partiel = row['Nom à rechercher']
    nouveau_nom = row['Nouveau nom']

    # Récupérer la liste des fichiers correspondants dans le dossier
    fichiers_correspondants = [
        fichier
        for fichier in os.listdir(dossier)
        if ancien_nom_partiel.lower() in fichier.lower()
    ]

    # Parcourir chaque fichier correspondant et le renommer
    for fichier in fichiers_correspondants:
        ancien_chemin = os.path.join(dossier, fichier)
        nom_fichier, extension = os.path.splitext(fichier)
        nouveau_nom_complet = nouveau_nom + extension
        nouveau_chemin = os.path.join(dossier, nouveau_nom_complet)

        if not os.path.exists(nouveau_chemin):
            os.rename(ancien_chemin, nouveau_chemin)
            print(f"Le fichier {fichier} a été renommé en {nouveau_nom_complet}.")
        else:
            print(f"Le fichier {fichier} existe déjà avec le nouveau nom {nouveau_nom_complet}.")

print("Terminé !")

Je vous remercie par avance pour votre aide sur ce sujet.

Bien à vous
Windows / Chrome 114.0.0.0

A voir également:

1 réponse

Whismeril Messages postés 19144 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 24 septembre 2024 919
Modifié le 24 juil. 2023 à 10:39

Bonjour


Pour tes prochains posts, merci d'utiliser la coloration syntaxique, comme décrit là https://codes-sources.commentcamarche.net/faq/11288-poster-un-extrait-de-code


Comme quoi, il n'est pas bon ChatGPT... Ce code est compliqué, alambiqué.

Dans un premier temps tu récupères les noms de fichiers en texte (donc sensible à la casse), tu les passes en minuscules (ce qui n'est pas cohérent avec ton besoin manifestement).

Puis tu cherches dans les noms en minuscules si un texte y apparaît (pas si le fichier  s'appelle "toto", mais si y a "toto" dedans, donc " la petite histoire de toto, assis au fond de classe près du radiateur" sera pris dans ton traitement. Et j'ai pas l'impression que ce soit ça que tu cherches selon ma compréhension de ton message.

Ensuite tu bricoles des chemins complets, et tu demandes à windows s'ils existent.

Mais le système de fichiers de windows est insensible à la casse, donc forcément, il te répond que oui. Et il ne renomme pas.

Avant d'aller plus loin, je voudrais savoir, si l'ancien nom de fichier doit

  • être exactement ce qui est écrit dans la colonne "Nom à chercher", casse comprise?
  • être le nom écrit dans la colonne mais insensible à la case
  • contenir le nom écrit dans la colonne, sensible à la casse
  • contenir le nom écrit dans la colonne, insensible à la casse (ce que le code fait pour l'instant)

0