web-dev-qa-db-fra.com

Glob recherche les fichiers par ordre chronologique?

J'ai cette ligne de code dans mon script python. Il recherche tous les fichiers d'un répertoire particulier pour * cycle * .log. 

for searchedfile in glob.glob("*cycle*.log"):

Cela fonctionne parfaitement. Toutefois, lorsque je lance mon script sur un emplacement réseau, il ne les recherche pas dans l’ordre mais effectue une recherche aléatoire. 

Existe-t-il un moyen de forcer le code à rechercher par ordre chronologique?

Cette question a été posée pour php mais je ne suis pas sûr des différences.

Merci

15
Jason Rogers

Pour trier les fichiers par date:

import glob
import os

files = glob.glob("*cycle*.log")
files.sort(key=os.path.getmtime)
print("\n".join(files))

Voir aussi Tri COMMENT UTILISER .

43
jfs

Bien. La réponse est non. glob uses os.listdir qui est décrit par:

"Retourne une liste contenant les noms des entrées du répertoire donné par chemin. La liste est dans un ordre arbitraire. Elle ne comprend pas les entrées spéciales '.' et '..' même s'ils sont présents dans le répertoire. "

Donc, vous êtes vraiment chanceux de l'avoir trié. Vous devez trier vous-même.

Cela fonctionne pour moi:

import glob
import os
import time

searchedfile = glob.glob("*.cpp")
files = sorted( searchedfile, key = lambda file: os.path.getctime(file))

for file in files:
 print("{} - {}".format(file, time.ctime(os.path.getctime(file))) )

Notez également que ceci utilise l'heure de création. Si vous souhaitez utiliser l'heure de modification, la fonction utilisée doit être getmtime.

4
luk32

Si vos chemins sont dans un ordre de tri, vous pouvez toujours les trier comme des chaînes (comme d'autres l'ont déjà mentionné dans leurs réponses). 

Cependant, si vos chemins utilisent un format de date/heure tel que %d.%m.%Y, cela devient un peu plus compliqué. Étant donné que strptime ne prend pas en charge les caractères génériques, nous avons développé un module datetime-glob pour analyser la date et l'heure à partir de chemins contenant des caractères génériques. 

En utilisant datetime-glob, vous pouvez parcourir l’arborescence, répertorier un répertoire, analyser la date/heure et les trier en tant que tuples (date/time, path).

Parmi les cas de test du module:

import pathlib
import tempfile

import datetime_glob

def test_sort_listdir(self):
    with tempfile.TemporaryDirectory() as tempdir:
        pth = pathlib.Path(tempdir)
        (pth / 'some-description-20.3.2016.txt').write_text('tested')
        (pth / 'other-description-7.4.2016.txt').write_text('tested')
        (pth / 'yet-another-description-1.1.2016.txt').write_text('tested')

        matcher = datetime_glob.Matcher(pattern='*%-d.%-m.%Y.txt')
        subpths_matches = [(subpth, matcher.match(subpth.name)) for subpth in pth.iterdir()]
        dtimes_subpths = [(mtch.as_datetime(), subpth) for subpth, mtch in subpths_matches]

        subpths = [subpth for _, subpth in sorted(dtimes_subpths)]

        # yapf: disable
        expected = [
            pth / 'yet-another-description-1.1.2016.txt',
            pth / 'some-description-20.3.2016.txt',
            pth / 'other-description-7.4.2016.txt'
        ]
        # yapf: enable

        self.assertListEqual(subpths, expected)
0
marko.ristin

Vous pouvez trier la liste des fichiers qui reviennent en utilisant os.path.getmtime ou os.path.getctime. Voir cet autre SO répondre et noter également les commentaires.

0
Tom

Identique à @jfs mais sur une ligne avec sorted

import os,glob
searchedfiles = sorted(glob.glob("*cycle*.log"), key=os.path.getmtime)
0
Pablo Reyes

Utilisation de glob no. En ce moment même, glob stocke tous les fichiers simultanément dans le code et n’a aucune méthode pour les organiser. Si seul le résultat final est important, vous pouvez utiliser une deuxième boucle qui vérifie la date du fichier et les stations en fonction de celle-ci. Si l'ordre d'analyse compte, glob n'est probablement pas le meilleur moyen de le faire.

0
Dylan Lawrence