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 :

Trier les fichiers d'un répertoire par date


Sujet :

Python

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 180
    Points : 65
    Points
    65
    Par défaut Trier les fichiers d'un répertoire par date
    Bonjour,

    Je voudrais trier les fichiers d'un répertoire par date afin de commencer par lire les fichiers les plus récents.

    J'ai trouvé ce code là sur le net mais j'y comprends pas grand chose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    import os
    from stat import ST_CTIME
    def get_files_by_date(directory):
     files = [(os.stat(f)[ST_CTIME], f) for f in os.listdir(directory) if os.path.isfile(f)]
     files.sort()
     return  [f for s,f in files]
    C'est surtout cette ligne là qui est très "louche" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    files = [(os.stat(f)[ST_CTIME], f) for f in os.listdir(directory) if os.path.isfile(f)]
    Petit problème de mise en forme, non ?

    De plus je comprends pas trop non plus cette ligne là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     return  [f for s,f in files]
    C'est quoi le s ? On retourne 2 arguments (dont une listdir) ?

    Merci d'avance de m'aiguiller sur ce code, ou si vous avez quelque chose à me proposer ça serait super
    J'imagine que c'est pas bien compliqué et je me doute bien qu'il faut utiliser la méthode sort() mais je vois pas trop.

  2. #2
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Points : 1 658
    Points
    1 658
    Par défaut
    Salut,

    L’objet files est défini comme une “liste par compréhension“, c’est à dire par une propriété de ses éléments, et non pas par énonciation de ceux-ci.
    La propriété est Cette propriété doit être vérifiée sur les éléments obtenus d’une autre liste: c’est la partie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for f in os.listdir(directory)
    (Il doit toujours y avoir une partie for.... dans une liste par compréhension)



    La propriété vérifiée sur un élément f de os.listdir(directory) permet d’enregistrer dans la liste files l’élément
    ( os.stat(f)[ST_CTIME] , f )
    Cet objet est un tuple, un couple plus précisément, composé des deux éléments
    os.stat(f)[ST_CTIME
    et f

    files est donc une liste de couples.






    Il y a des cas où les parenthèses d’un tuple peuvent ne pas être mises. C’est le cas pour le s,f dans la ligne de return. Il faut lire en fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return [f for (s,f) in files]
    Cette ligne retourne une liste définie par compréhension, à nouveau.
    f est l’élément du couple (s,f) qui est gardé pour constituer la liste.
    Ici la propriété est implicite: on garde le premier élément de (s,f) dans la liste.
    On pourrait aussi écrire cette ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return [ c[1] for c in files]
    Soit dit en passant, je pense que dans la précédente liste définie on pourrait écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    files = [os.stat(f)[ST_CTIME], f for f in...etc
    mais de mon point de vue ça ne présente pas d’intérêt.







    Pendant qu’on y est, noter que ce qui caractérise un tuple est la présence de virgules entre ses éléments.
    C’est d’ailleurs pourquoi (s,f) peut s’écrire s,f : ce n’est pas les parenthèses qui sont importantes mais la virgule.

    S’il n’y a qu’un élément, on est obligé de mettre une virgule terminale pour faire un tuple , par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (’salsifis’,)  # est un tuple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (’salsifis’) # n’est pas un tuple mais un générateur de chaîne
    ,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (123.4) #  estun générateur de nombre
    etc

    Pour les tuples à plusieurs éléments, la virgule terminale est facultative puisqu’il y en a entre les éléments.
    Même si personne n’écrit ainsi, (’orange’,’banane’,’framboise’,) est aussi un tuple.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 180
    Points : 65
    Points
    65
    Par défaut
    Merci beaucoup eyquem, c'est très clair et complet !

    Je ne connaissais pas du tout les tuples.

    Par ailleurs, dans la liste qui est retournée, est ce qu'il y a moyen d'ordonner par date en ordre croissant ou décroissant ?

    Merci.

  4. #4
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Points : 923
    Points
    923
    Par défaut
    Elle est déjà triée ! C'est la ligne
    qui fait le tri. Comme c'est une liste de couples, le tri se fait sur le premier élément, ici la date de création (c'est le os.stat(f)[ST_CTIME]), pour plus d'informations sur os.stat : http://docs.python.org/library/os.html#os.stat

  5. #5
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Points : 1 658
    Points
    1 658
    Par défaut
    Je pense que c’est une bonne chose, quand on utilise une méthode, de toujours se demander plus ou moins fortement: «qu’est ce qu’elle prend, qu’est-ce qu’elle sort» ?

    Je dis ça à propos de
    listdir(path)
    Return a list containing the names of the entries in the directory.
    names et non pas path

    Or il faut un path comme argument à os.path.isfile() et non un nom.
    Comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for f in os.listdir(directory)
    produit seulement des noms f , tous les os.path.isfile(f) sont False

    D’ailleurs, une bonne chose aussi, c’est de donner des noms aux “variables“ qui aient rapport avec ce qu’elles représentent. Ainsi fname fait mieux réagir quand on écrit isfile(fname) que isfile(f)



    Solution

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    files = [(os.stat(directory+'\\'+f)[ST_CTIME], f) for f in os.listdir(directory) if os.path.isfile(directory+'\\'+f)]




    Une meilleure solution serait de recourir à une méthode qui produirait une liste de chemins directement , à la place de listdir()
    Ça doit bien exister mais je n’ai pas trouvé.

    Par contre, j’ai vu que
    getctime( path)
    donne le CTIME d’un fichier sans devoir passer par os.stat() qui produit un tuple de 10 éléments dans lequel il faut ensuite sélectionner ST_CTIME





    Qu: es-tu bien sûr que c’est le CTIME dont tu as besoin ?

    st_ctime (platform dependent; time of most recent metadata change on Unix, or the time of creation on Windows)

    tandis que

    st_mtime (time of most recent content modification)
    et
    st_atime (time of most recent access)

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 180
    Points : 65
    Points
    65
    Par défaut
    J'ai bien besoin du CTime sachant que je sais que les fichiers ne seront pas modifiés après de toute façon.

    Merci pour vos réponses ça m'a bien aidé !

    Bonne journée,

    Julien.

  7. #7
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Points : 1 658
    Points
    1 658
    Par défaut
    Pour exécuter
    os.path.isfile(directory+'\\'+f)
    et os.stat(directory+'\\'+f)
    le programme doit trouver le fichier de nom
    directory+'\\'+f à partir d’un répertoire plus ou moins en amont

    Si l’arborescence est touffue, il peut être plus efficace de le faire travailler comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    def get_files_by_date(directory):
        alentree = os.getcwd()
        os.chdir(directory)
        files = [(os.stat(fname)[ST_CTIME], fname) for fname in os.listdir(directory) if os.path.isfile(fname)]
        files.sort()
        os.chdir(alentree)
        return  [f for s,f in files]

    Si on ne fait pas os.chdir(alentree) avant de resortir de la fonction, on se retrouve avec directory comme répertoire courant après être sorti de la fonction. Ce peut être vérifié en plaçant un getcwd() avant et après l’appel de la fonction.

    C’est la première fois que je vois une action exécutée au sein d’une fonction dont l’effet persiste une fois que la fonction est refermée.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 180
    Points : 65
    Points
    65
    Par défaut
    Merci beaucoup eyquem !

    Je m'étais déjà fait avoir avec ce type de problème mais un petit rappel ne fait pas de mal

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 27/10/2016, 19h56
  2. Problème pour trier les fichiers d'un dossier par date
    Par Stephane_br dans le forum VB.NET
    Réponses: 7
    Dernier message: 24/07/2012, 16h34
  3. Réponses: 5
    Dernier message: 10/05/2010, 11h46
  4. Classement des fichiers d'un répertoire par date
    Par lunick dans le forum Langage
    Réponses: 1
    Dernier message: 16/06/2008, 14h22
  5. lister les fichiers d'un repertoire par date
    Par ra77 dans le forum Langage
    Réponses: 1
    Dernier message: 02/06/2006, 03h02

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