os.path.commonprefix () ve os.path.relpath () arkadaşlarınız:
>>> 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
'/'
Böylece, ortak önekin yollardan biri olup olmadığını, yani yollardan birinin ortak bir ata olup olmadığını test edebilirsiniz:
paths = […, …, …]
common_prefix = os.path.commonprefix(list_of_paths)
if common_prefix in paths:
…
Ardından göreli yolları bulabilirsiniz:
relative_paths = [os.path.relpath(path, common_prefix) for path in paths]
Hatta bu yöntemle ikiden fazla yolu işleyebilir ve tüm yolların bunlardan birinin altında olup olmadığını test edebilirsiniz.
Not : Yollarınızın nasıl göründüğüne bağlı olarak, önce bir miktar normalleştirme yapmak isteyebilirsiniz (bu, her zaman '/' ile bitip bitmeyeceklerini veya bazı yolların göreceli olup olmadığını bilmedikleri durumlarda yararlıdır). İlgili işlevler arasında os.path.abspath () ve os.path.normpath () yer alır .
PPS : Peter Briggs'in yorumlarda belirttiği gibi, yukarıda açıklanan basit yaklaşım başarısız olabilir:
>>> os.path.commonprefix(['/usr/var', '/usr/var2/log'])
'/usr/var'
olsa bile /usr/varolduğunu değil yollarının ortak önek. Aramadan önce tüm yolları '/' ile bitmeye zorlamak commonprefix()bu (özel) sorunu çözer.
PPPS : bluenote10'un belirttiği gibi, eğik çizgi eklemek genel sorunu çözmez. Takip eden sorusu: Python'un os.path.commonprefix'in yanılsamasını nasıl atlayabiliriz?
PPPPS : Python 3.4 ile başlayarak, daha akılcı bir yol manipülasyon ortamı sağlayan bir modül olan pathlib var . Bir yol kümesinin ortak önekinin, her bir yolun tüm öneklerini (ile PurePath.parents()) alarak, tüm bu üst kümelerin kesişimini alarak ve en uzun ortak öneki seçerek elde edilebileceğini tahmin ediyorum .
PPPPPS : Python 3.5 bu soruya os.path.commonpath()geçerli bir yol döndüren uygun bir çözüm sundu: