os.path.commonprefix() y os.path.relpath() sont vos amis :
>>> print os.path.commonprefix(['/usr/var/log', '/usr/var/security'])
'/usr/var'
>>> print os.path.commonprefix(['/tmp', '/usr/var']) # No common prefix: the root is the common prefix
'/'
Vous pouvez ainsi vérifier si le préfixe commun est l'un des chemins, c'est-à-dire si l'un des chemins est un ancêtre commun :
paths = […, …, …]
common_prefix = os.path.commonprefix(list_of_paths)
if common_prefix in paths:
…
Vous pouvez alors trouver les chemins relatifs :
relative_paths = [os.path.relpath(path, common_prefix) for path in paths]
Cette méthode permet même de gérer plus de deux chemins et de vérifier si tous les chemins se trouvent en dessous de l'un d'entre eux.
PS Selon l'aspect de vos chemins d'accès, il est possible que vous souhaitiez d'abord effectuer une normalisation (utile dans les situations où l'on ne sait pas si les chemins d'accès se terminent toujours par '/' ou non, ou si certains chemins d'accès sont relatifs). Les fonctions pertinentes sont les suivantes os.path.abspath() y os.path.normpath() .
PPS Le projet de loi sur l'emploi et l'égalité des chances : comme Peter Briggs l'a mentionné dans les commentaires, l'approche simple décrite plus haut peut échouer :
>>> os.path.commonprefix(['/usr/var', '/usr/var2/log'])
'/usr/var'
même si /usr/var
est pas un préfixe commun aux chemins. Forcer tous les chemins à se terminer par '/' avant d'appeler commonprefix()
résout ce problème (spécifique).
PPPS : comme l'a indiqué bluenote10, l'ajout d'une barre oblique ne résout pas le problème général. Voici sa question de suivi : Comment contourner l'erreur de os.path.commonprefix de Python ?
PPPPS : en commençant par Python 3.4, nous avons pathlib Un module qui offre un environnement plus sain pour la manipulation des chemins d'accès. Je suppose que le préfixe commun d'un ensemble de chemins peut être obtenu en récupérant tous les préfixes de chaque chemin (avec PurePath.parents()
), en prenant l'intersection de tous ces ensembles de parents et en sélectionnant le préfixe commun le plus long.
PPPPPS : Python 3.5 a introduit une solution appropriée à cette question : os.path.commonpath()
qui renvoie un chemin valide.