os.path.commonprefix () und os.path.relpath () sind deine Freunde:
>>> 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
'/'
Sie können also testen, ob das gemeinsame Präfix einer der Pfade ist, dh ob einer der Pfade ein gemeinsamer Vorfahr ist:
paths = […, …, …]
common_prefix = os.path.commonprefix(list_of_paths)
if common_prefix in paths:
…
Sie können dann die relativen Pfade finden:
relative_paths = [os.path.relpath(path, common_prefix) for path in paths]
Mit dieser Methode können Sie sogar mehr als zwei Pfade verarbeiten und testen, ob alle Pfade unter einem von ihnen liegen.
PS : Je nachdem, wie Ihre Pfade aussehen, möchten Sie möglicherweise zuerst eine Normalisierung durchführen (dies ist in Situationen nützlich, in denen nicht bekannt ist, ob sie immer mit '/' enden oder nicht oder ob einige der Pfade relativ sind). Relevante Funktionen sind os.path.abspath () und os.path.normpath () .
PPS : Wie Peter Briggs in den Kommentaren erwähnt hat, kann der oben beschriebene einfache Ansatz fehlschlagen:
>>> os.path.commonprefix(['/usr/var', '/usr/var2/log'])
'/usr/var'
obwohl /usr/varist kein allgemeines Präfix der Pfade. Das Erzwingen, dass alle Pfade vor dem Aufruf mit '/' enden, commonprefix()löst dieses (spezifische) Problem.
PPPS : Wie in bluenote10 erwähnt, löst das Hinzufügen eines Schrägstrichs das allgemeine Problem nicht. Hier ist seine Folgefrage: Wie kann man den Irrtum von Pythons os.path.commonprefix umgehen?
PPPPS : Ab Python 3.4 haben wir pathlib , ein Modul, das eine sanere Pfadmanipulationsumgebung bietet. Ich vermute, dass das gemeinsame Präfix eines Satzes von Pfaden erhalten werden kann, indem alle Präfixe jedes Pfades (mit PurePath.parents()) abgerufen , der Schnittpunkt aller dieser übergeordneten Sätze genommen und das längste gemeinsame Präfix ausgewählt werden.
PPPPPS : Python 3.5 hat eine geeignete Lösung für diese Frage eingeführt : os.path.commonpath(), die einen gültigen Pfad zurückgibt.