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 :

supprimer des fichiers en fonction de leur extension


Sujet :

Python

  1. #1
    Membre averti Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Points : 383
    Points
    383
    Par défaut supprimer des fichiers en fonction de leur extension
    Bonjour,

    Je souhaite supprimer des fichiers en fonction de leur extensions.

    Je suis partie de ça mais ça ne fonctionne pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    import os
    extension="*.avi"
    os.remove(extension)
    Le message d'erreur été prévisible :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    raceback (most recent call last):
      File "remove_extension_file.py", line 3, in <module>
        os.remove(extension)
    OSError: [Errno 2] No such file or directory: '*.avi'
    Donc je me dis que peut être je pourrais faire une liste contenant les fichiers ayant une certaine extension
    Ensuite pour chaque fichier dans la liste, les supprimer.

    Est ce la bonne méthode ou alors une solution plus simple que la manipulation de listes est faisable?

    Merci par avance pour vos réponses.

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par nekcorp Voir le message
    Je suis partie de ça mais ça ne fonctionne pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    import os
    extension="*.avi"
    os.remove(extension)
    Bonjour
    C'est normal. Tu as essayé de faire une analogie entre la façon de nommer un fichier dans os.remove() et la façon de le nommer dans ton interpréteur (peut-être shell).
    Or, quand tu appelles (toujours en shell) rm *.avi (ou bien del *.avi en msDos), c'est l'interpréteur qui "interprète" (justement) cette étoile et qui lui fait correspondre l'ensemble des fichiers de ton dossier dont le nom matche ta demande (toute chaine se terminant par ".avi"). Ensuite, il passe à la commande "rm" (ou "del") les fichiers correspondants.

    C'est plus logique non ? Je veux dire que ce soit l'interpréteur qui se charge en amont de transformer l'étoile avant de passer le résultat à la commande X ou Y plutôt que de passer l'étoile à la commande X ou Y et de devoir alors programmer cette transformation dans chacune des commandes X ou Y de ton os (c'est peut-être pas flagrant en msDos qui possède 3 commandes moisies qui se courrent après mais sous Unix/Linux, les commandes utilisables se chiffrent par centaines...)

    Donc au plus bas niveau (C, Python), les routines systèmes attendent des noms clairs et réalistes et non des jokers qu'il faudra analyser et comparer...

    Citation Envoyé par nekcorp Voir le message
    Est ce la bonne méthode ou alors une solution plus simple que la manipulation de listes est faisable?
    Ben t'as os.listdir(".") qui te renvoie une liste contenant tous les fichiers de ton dossier courant. Tout ce que tu as à faire, c'est les prendre un par un et regarder si leur nom se termine par ".avi".

    T'as aussi la bibliothèque "glob" qui (je crois) sait manipuler l'étoile mais comme je ne la connais pas, je te laisse fouiller tout seul de ce coté...

  3. #3
    Membre averti Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Points : 383
    Points
    383
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Bonjour
    C'est normal. Tu as essayé de faire une analogie entre la façon de nommer un fichier dans os.remove() et la façon de le nommer dans ton interpréteur (peut-être shell).
    Or, quand tu appelles (toujours en shell) rm *.avi (ou bien del *.avi en msDos), c'est l'interpréteur qui "interprète" (justement) cette étoile et qui lui fait correspondre l'ensemble des fichiers de ton dossier dont le nom matche ta demande (toute chaine se terminant par ".avi"). Ensuite, il passe à la commande "rm" (ou "del") les fichiers correspondants.

    C'est plus logique non ? Je veux dire que ce soit l'interpréteur qui se charge en amont de transformer l'étoile avant de passer le résultat à la commande X ou Y plutôt que de passer l'étoile à la commande X ou Y et de devoir alors programmer cette transformation dans chacune des commandes X ou Y de ton os (c'est peut-être pas flagrant en msDos qui possède 3 commandes moisies qui se courrent après mais sous Unix/Linux, les commandes utilisables se chiffrent par centaines...)

    Donc au plus bas niveau (C, Python), les routines systèmes attendent des noms clairs et réalistes et non des jokers qu'il faudra analyser et comparer...


    Ben t'as os.listdir(".") qui te renvoie une liste contenant tous les fichiers de ton dossier courant. Tout ce que tu as à faire, c'est les prendre un par un et regarder si leur nom se termine par ".avi".

    T'as aussi la bibliothèque "glob" qui (je crois) sait manipuler l'étoile mais comme je ne la connais pas, je te laisse fouiller tout seul de ce coté...
    Merci pour ta réponse.

    C'est plus logique non ? Je veux dire que ce soit l'interpréteur qui se charge en amont de transformer l'étoile avant de passer le résultat à la commande X ou Y plutôt que de passer l'étoile à la commande X ou Y et de devoir alors programmer cette transformation dans chacune des commandes X ou Y de ton os (c'est peut-être pas flagrant en msDos qui possède 3 commandes moisies qui se courrent après mais sous Unix/Linux, les commandes utilisables se chiffrent par centaines...)
    Oui je comprend, ça parait logique effectivement. Je ne savait pas que l'étoile avant l'extension été interprété et remplacé suivant l'os .

    T'as aussi la bibliothèque "glob" qui (je crois) sait manipuler l'étoile mais comme je ne la connais pas, je te laisse fouiller tout seul de ce coté...
    Oui effectivement "glob" gère l'étoile. C'est l'idée que je voulais faire au départ mais je pensais qu'il existait peut être de plus simple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    import glob 
    for f in glob.glob("*.jpeg"): 
    print f
    Je vais bidouiller avec ça.

    Merci

  4. #4
    Membre averti Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Points : 383
    Points
    383
    Par défaut
    voila le code fonctionnel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    import glob
    import os
     
    extension="*.avi"
    for f in glob.glob(extension):
      os.remove(f)
    Si vous avez une solution plus courte, je sais bien que quelqu'un en proposera une

    Merci d'avance

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par nekcorp Voir le message
    Si vous avez une solution plus courte, je sais bien que quelqu'un en proposera une
    Bah, juste pour le fun
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    import os
    import glob
    extension="*.avi"
    map(lambda f: os.remove(f), glob.glob(extension))


    Mais bon, créer une map qu'on n'utilise pas donne un code plus court en lignes mais perd en efficience...

    Sinon je ne sais pas l'avantage/inconvénient à remplacer glob.glob par os.listdir() et gérer soi-même l'extension
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    import os
    for f in os.listdir("."):
        if f[-4:] == ".avi":
            os.remove(f)
    ...

  6. #6
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 478
    Points : 9 278
    Points
    9 278
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Citation Envoyé par Sve@r Voir le message
    Sinon je ne sais pas l'avantage/inconvénient à remplacer glob.glob par os.listdir() et gérer soi-même l'extension
    glob a été construit avec os.listdir et fnmatch. Il est donc plus simple d'utilisation pour résoudre des problèmes simples.

    En particulier, il renvoie des chemins complets alors que os.listdir renvoie des noms de fichiers (qu'il faut donc compléter avec le nom du répertoire pour pouvoir le tester).

    Dans les 2 cas, les noms des sous-répertoires sont renvoyés aussi (s'ils correspondent à la recherche pour glob), et il faut donc les tester avec os.path.isdir pour ne garder que les fichiers.

    Pour des cas complexes, os.listdir est plus approprié mais conduit à des codes plus complexes et plus longs. On peut, par exemple, avoir une liste de sélections (par exemple: ["*.py", "*.pyw", "*.pyx", "*.cpp", "*.h]) à tester dans une boucle avec fnmatch.

  7. #7
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par tyrtamos Voir le message
    glob a été construit avec os.listdir et fnmatch. Il est donc plus simple d'utilisation pour résoudre des problèmes simples.
    En particulier, il renvoie des chemins complets alors que os.listdir renvoie des noms de fichiers (qu'il faut donc compléter avec le nom du répertoire pour pouvoir le tester).
    Moui. Je suis en effet allé voir glob (qui n'est vraiment pas énorme => juste glob() et iglob() qui renvoient la même chose). C'est vrai que récupérer la liste des fichiers complétée du nom du dossier peut être utile.
    Bref je ne faisais pas énormément de listdir() auparavant mais la prochaine fois que j'en ai l'utilité, je réfléchirai à l'opportunité d'utiliser glob à la place...

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

Discussions similaires

  1. [Batch] Supprimer des fichiers en fonction de leur date
    Par charlix dans le forum Scripts/Batch
    Réponses: 55
    Dernier message: 05/10/2015, 17h18
  2. Réponses: 2
    Dernier message: 21/08/2009, 12h18
  3. écrire une liste de fichiers en fonction de leur extension
    Par seb.garcia dans le forum Général Python
    Réponses: 5
    Dernier message: 10/01/2009, 15h06
  4. Supprimer des fichiers en fonction de la date sous DOS
    Par charlix dans le forum Windows
    Réponses: 0
    Dernier message: 21/03/2008, 08h18
  5. Récuperer des fichiers en fonction de leur ancienneté
    Par julien000 dans le forum Langage
    Réponses: 3
    Dernier message: 24/07/2006, 17h09

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