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
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 .
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
.
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)
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.
Identique à @jfs mais sur une ligne avec sorted
import os,glob
searchedfiles = sorted(glob.glob("*cycle*.log"), key=os.path.getmtime)
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.