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 :

renommer noms de fichier à partir d'une liste [PYTHON 3.7.7]


Sujet :

Python

  1. #1
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2016
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2016
    Messages : 67
    Par défaut renommer noms de fichier à partir d'une liste [PYTHON 3.7.7]
    Bonjour
    mon objectif est changer les noms de fichiers à partir d'une liste de mots à supprimer.
    sauf que python me renvoie que les "chemins" des fichiers sont introuvables. FileNotFoundError: [WinError 2]
    pouvez vous me donner un coup de pouce?
    voici le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    import glob,os
    x= ["xao ","you", "ren", "herv", "min"]
    files=[file  for file in glob.iglob('**/*',recursive= True )]
    #print (files)
    i = 0
    for f in files:
           for j in x:
                  mi=os.rename(f, f.replace(j, " "))
                  i += 1
    print ('{0} fichiers ont été modifiés'.format(i))
    merci d'avance

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 748
    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 748
    Par défaut
    Salut,

    Relisez votre code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for f in files:
           for j in x:
                  mi=os.rename(f, f.replace(j, " "))
    Le "for j in x" s'applique plusieurs fois au même fichier.

    A chaque itération, f.replace(j, " ") retournera f s'il ne trouve pas j... Déjà est-il utile de renommer f en f?
    Puis, lorsque replace retourne autre chose que f, le fichier est renommé... et il n'existe plus!

    Il serait plus logique de fabriquer le nouveau nom de fichier... et de ne faire un rename que si le nom est vraiment nouveau.

    Faites aussi attention au fait que f peut aussi contenir le nom du répertoire: si vous remplacez cette partie là, il y a de forte chance pour que le repertoire destination n'existe pas!

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

  3. #3
    Membre Expert

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Par défaut
    Avant de faire un os.rename, faites plutot un print, pour contrôler que tout se passe bien.

    Car là estimez vous heureux d'avoir un message d'erreur. Vous aurriez pu tomber dans un cas où python aurait réussi à faire qqch, mais ça vous aurais juste mis le bazar intégral dans tous vos fichiers sans retour en arrière possible !

    Et donc le 2ieme conseil est de sauvegarder votre dossier (dans une archive par exemple) avant de faire tourner quoi que ce soit comme code !

  4. #4
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2016
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2016
    Messages : 67
    Par défaut

    A chaque itération, f.replace(j, " ") retournera f s'il ne trouve pas j... Déjà est-il utile de renommer f en f?
    Puis, lorsque replace retourne autre chose que f, le fichier est renommé... et il n'existe plus!

    Il serait plus logique de fabriquer le nouveau nom de fichier... et de ne faire un rename que si le nom est vraiment nouveau.
    - W
    merci le problème est d'itérer string de la liste [x] afin de savoir si ces mots sont présents dans les noms des répertoires ou fichiers et les supprimer.
    je voudrais harmoniser mes noms de répertoires et fichiers en enlevant les mots dans la liste [x].

    Faites aussi attention au fait que f peut aussi contenir le nom du répertoire: si vous remplacez cette partie là, il y a de forte chance pour que le repertoire destination n'existe pas!
    c'est effectivement ce qu'il se passe , puis je pas d'abord modifier les noms de fichiers et ensuite les répertoires?

    Merci d'avance

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 748
    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 748
    Par défaut
    Citation Envoyé par Rizcolas62 Voir le message
    c'est effectivement ce qu'il se passe , puis je pas d'abord modifier les noms de fichiers et ensuite les répertoires?
    Il vous faut définir les étapes pour que çà fonctionne sans vous retrouver à scier la branche sur laquelle vous êtes assis (les chemins retournés par glob).

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

  6. #6
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2016
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2016
    Messages : 67
    Par défaut
    arff je bloque :/
    et je m'emmêle les pinceaux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    import glob,os
    x= ["xao ","you", "ren", "herv", "min"]
    files=[file  for file in glob.iglob('**/*',recursive= True )]
    #print (files)
    i = 0
    k= [(m,n) for m,n in enumerate(x) if (n in files)]
    for m,n in k:
           if bool(k) is True:
                  print (files.replace (n, " "))
                  i += 1
    #print ('{0} fichiers ont été modifiés'.format(i))

  7. #7
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 748
    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 748
    Par défaut
    Citation Envoyé par Rizcolas62 Voir le message
    et je m'emmêle les pinceaux
    Si vous ne commencez pas par décrire (en français) les différentes étapes à effectuer (et validé que çà vole au moins sur le papier et en testant un peu à la main avec des rename lancés depuis un terminal) vous ne savez pas trop ce que vous voulez coder (et moi non plus).

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

  8. #8
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2016
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2016
    Messages : 67
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Si vous ne commencez pas par décrire (en français) les différentes étapes à effectuer (et validé que çà vole au moins sur le papier et en testant un peu à la main avec des rename lancés depuis un terminal) vous ne savez pas trop ce que vous voulez coder (et moi non plus).

    - W
    - ok d'abord je veux regarder dans les répertoires si le mot de la liste est dans le nom du répertoire,
    si oui remplacer ' '
    - faire de même pour les noms de fichiers
    J'ai essayé avec os.walk mais toujours le même problème
    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
    for root, directories, files in os.walk(space, topdown=True):
                  for direct in directories:
                         k= [n for n in x if (n in direct)]
                         for n in k:
                                if bool(k) is True:
                                       c=direct.replace(n,"")
                                       #print (c)
                                       os.rename(direct,c)
                                       break
    for root, directories, files in os.walk(space, topdown=True):
                  for filename in files:
                         #print(filename)
                         k= [n for n in x if (n in filename)]
                         for n in k:
                                if bool(k) is True:
                                       #print (filename)
                                       w=filename.replace(n,"")
                                       print (w)
    parfois le nom du fichier ou du répertoire possède deux mots de la liste.

  9. #9
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 748
    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 748
    Par défaut
    Citation Envoyé par Rizcolas62 Voir le message
    - ok d'abord je veux regarder dans les répertoires si le mot de la liste est dans le nom du répertoire
    Si vous utilisez os.walk vous devez commencer par regarder ce que contiennent les variables root, directories,... qu'il retourne.

    Puis comme on vous l'a déjà suggéré, faites un print de l'ancien nom et du nouveau nom pour vous assurer que çà correspond à ce que vous attendiez avant d'essayer un os.rename, n'est pas un luxe.

    Vous ne pouvez pas vous lancez à programmer sans avoir "appris".
    Il y a des tutos et des exercices corrigés pour çà.

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

  10. #10
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2016
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2016
    Messages : 67
    Par défaut
    oui j'ai bien compris en fait c'est l a boucle 'for n in k:' qui me pose problème c'est à dire pour chaque n dans la liste de mot k elle crée un nouvelle chaine ce qui explique qu'elles sont difficiles à réutiliser dans os.rename...
    cdlt

  11. #11
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 748
    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 748
    Par défaut
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
                  for direct in directories:
                         k= [n for n in x if (n in direct)]
                         for n in k:
                                if bool(k) is True:
                                       c=direct.replace(n,"")
    Relisez votre code:
    on prend une chaine de caractères (direct)
    on fait la liste des remplacements (k)
    puis le if bool(k) is True ne sert à rien car si k était vide le for n in... ne serait pas entré dans le corps de la boucle.
    puis on remplace le "n" qui est dans "direct" (beurk...)
    puis on fait le rename.
    Déjà à l'itération suivante, on ne trouvera plus le répertoire (pour autant qu'on le trouve). Ce qui était déjà une erreur que vous aviez avant.

    Prendre une chaine de caractères "ABABXYZ" et remplacer les B et le X par '*' (ou ''), est le genre d'exo. qu'on trouve dans les tutos. Si déjà vous êtes coincé pour faire çà, ouvrez un tuto. apprenez les bases. On ne peut pas vous expliquer ce que vous n'avez pas essayé de comprendre par vous même. Juste essayer de vous le présenter un peu différemment.

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

Discussions similaires

  1. Dupliquer un fichier à partir d'une liste de noms dans un fichier txt
    Par bigs3232 dans le forum Shell et commandes GNU
    Réponses: 36
    Dernier message: 03/07/2017, 14h46
  2. [XL-2010] Macro pour renommer des fichiers à partir d'une liste de nom de fichiers
    Par thomahh dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 25/01/2013, 17h03
  3. Réponses: 5
    Dernier message: 03/05/2007, 13h44
  4. [Conception] Téléchargement de fichier à partir d'une liste selectionnée
    Par charafax dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 16/04/2007, 13h53
  5. Sélectionner un fichier à partir d'une liste filtrée
    Par Lenaick dans le forum C++Builder
    Réponses: 7
    Dernier message: 14/03/2006, 11h16

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