Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Licence CC BY-NC-ND Thierry Parmentelat

parcours de dossier

en 2024 tous les calculs/parcours sur le contenu du disque, dossiers, fichiers, et métadonnées telles que tailles, dates, etc... se font avec le couteau suisse pathlib

lisez-bien tout le notebook, et surtout les indices, avant de commencer

(et non plus avec os.path et autres glob comme on aurait pu le faire dans le passé)

initialisation

on va partir d’un dossier avec un peu de contenu; c’est pour simuler par exemple un dossier avec des logs

Wrote file pathlib-foo/logs/file1 - size 11
Wrote file pathlib-foo/logs/dir1/filebxxxxxx - size 12
Wrote file pathlib-foo/logs/dir1/filebbxxxxxx - size 13
Wrote file pathlib-foo/logs/dir1/filebbbxxxxxx - size 14
Wrote file pathlib-foo/logs/file10 - size 10
Wrote file pathlib-foo/logs/dir10/fileaxxxx - size 102
Wrote file pathlib-foo/logs/dir10/fileaaxxxx - size 103
Wrote file pathlib-foo/logs/dir10/fileaaaxxxx - size 104
Wrote file pathlib-foo/logs/file100 - size 9
Wrote file pathlib-foo/logs/dir100/filecxx - size 1002
Wrote file pathlib-foo/logs/dir100/fileccxx - size 1003
Wrote file pathlib-foo/logs/dir100/filecccxx - size 1004

pb1: parcours de dossier

on veut parcourir tout un dossier, c’est-à-dire calculer la liste des fichiers qui se trouvent dans un dossier; et cela récursivement ou pas (en parcourant ou non les sous-dossiers)

on vous demande d’écrire une fonction scan_dir qui prend en paramètres:

et qui renvoie une liste d’objets de type Path, qui correspondent aux fichiers (pas les dossiers) qui se situent en dessous de root/relative

exemples

pathlib-foo/logs/dir1/filebbxxxxxx
pathlib-foo/logs/dir1/filebxxxxxx
pathlib-foo/logs/dir1/filebbbxxxxxx
pathlib-foo/logs/file100
pathlib-foo/logs/file10
pathlib-foo/logs/file1
pathlib-foo/logs/dir10/fileaaxxxx
pathlib-foo/logs/dir10/fileaaaxxxx
pathlib-foo/logs/dir10/fileaxxxx
pathlib-foo/logs/dir100/filecxx
pathlib-foo/logs/dir100/fileccxx
pathlib-foo/logs/dir100/filecccxx
pathlib-foo/logs/dir1/filebbxxxxxx
pathlib-foo/logs/dir1/filebxxxxxx
pathlib-foo/logs/dir1/filebbbxxxxxx

pb2: idem mais en triant

on veut maintenant pouvoir trier cette information

on veut écrire une fonction sort_dir qui prend les mêmes paramètres, et en plus

exemples

[PosixPath('pathlib-foo/logs/file100'), PosixPath('pathlib-foo/logs/file10'), PosixPath('pathlib-foo/logs/file1'), PosixPath('pathlib-foo/logs/dir1/filebxxxxxx'), PosixPath('pathlib-foo/logs/dir1/filebbxxxxxx'), PosixPath('pathlib-foo/logs/dir1/filebbbxxxxxx'), PosixPath('pathlib-foo/logs/dir10/fileaxxxx'), PosixPath('pathlib-foo/logs/dir10/fileaaxxxx'), PosixPath('pathlib-foo/logs/dir10/fileaaaxxxx'), PosixPath('pathlib-foo/logs/dir100/filecxx'), PosixPath('pathlib-foo/logs/dir100/fileccxx'), PosixPath('pathlib-foo/logs/dir100/filecccxx')]
[PosixPath('pathlib-foo/logs/file1'), PosixPath('pathlib-foo/logs/file10'), PosixPath('pathlib-foo/logs/file100'), PosixPath('pathlib-foo/logs/dir100/filecxx'), PosixPath('pathlib-foo/logs/dir100/fileccxx'), PosixPath('pathlib-foo/logs/dir10/fileaxxxx'), PosixPath('pathlib-foo/logs/dir100/filecccxx'), PosixPath('pathlib-foo/logs/dir10/fileaaxxxx'), PosixPath('pathlib-foo/logs/dir10/fileaaaxxxx'), PosixPath('pathlib-foo/logs/dir1/filebxxxxxx'), PosixPath('pathlib-foo/logs/dir1/filebbxxxxxx'), PosixPath('pathlib-foo/logs/dir1/filebbbxxxxxx')]

Indices

PosixPath('pathlib-foo')
PosixPath('pathlib-foo/logs/dir100/filecxx')
1002
[PosixPath('pathlib-foo/logs/file100'), PosixPath('pathlib-foo/logs/dir10'), PosixPath('pathlib-foo/logs/file10'), PosixPath('pathlib-foo/logs/dir100'), PosixPath('pathlib-foo/logs/file1'), PosixPath('pathlib-foo/logs/dir1')]
[PosixPath('pathlib-foo/logs'), PosixPath('pathlib-foo/logs/file100'), PosixPath('pathlib-foo/logs/dir10'), PosixPath('pathlib-foo/logs/file10'), PosixPath('pathlib-foo/logs/dir100'), PosixPath('pathlib-foo/logs/file1'), PosixPath('pathlib-foo/logs/dir1'), PosixPath('pathlib-foo/logs/dir1/filebbxxxxxx'), PosixPath('pathlib-foo/logs/dir1/filebxxxxxx'), PosixPath('pathlib-foo/logs/dir1/filebbbxxxxxx'), PosixPath('pathlib-foo/logs/dir100/filecxx'), PosixPath('pathlib-foo/logs/dir100/fileccxx'), PosixPath('pathlib-foo/logs/dir100/filecccxx'), PosixPath('pathlib-foo/logs/dir10/fileaaxxxx'), PosixPath('pathlib-foo/logs/dir10/fileaaaxxxx'), PosixPath('pathlib-foo/logs/dir10/fileaxxxx')]
[PosixPath('pathlib-foo/logs/file100'), PosixPath('pathlib-foo/logs/dir10'), PosixPath('pathlib-foo/logs/file10'), PosixPath('pathlib-foo/logs/dir100'), PosixPath('pathlib-foo/logs/file1'), PosixPath('pathlib-foo/logs/dir1'), PosixPath('pathlib-foo/logs/dir10/fileaaxxxx'), PosixPath('pathlib-foo/logs/dir10/fileaaaxxxx'), PosixPath('pathlib-foo/logs/dir10/fileaxxxx'), PosixPath('pathlib-foo/logs/dir100/filecxx'), PosixPath('pathlib-foo/logs/dir100/fileccxx'), PosixPath('pathlib-foo/logs/dir100/filecccxx'), PosixPath('pathlib-foo/logs/dir1/filebbxxxxxx'), PosixPath('pathlib-foo/logs/dir1/filebxxxxxx'), PosixPath('pathlib-foo/logs/dir1/filebbbxxxxxx')]
('pathlib-foo', 'logs', 'dir100', 'filecxx')
[PosixPath('pathlib-foo/logs/dir100'), PosixPath('pathlib-foo/logs'), PosixPath('pathlib-foo'), PosixPath('.')]
PosixPath('/__w/exos-python/exos-python/notebooks/exos/basic/pathlib-foo/logs/dir100/filecxx')
PosixPath('logs/dir100/filecxx')

solution

variantes possibles