os.path.commonprefix () और os.path.relpath () आपके मित्र हैं:
>>> 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
'/'
आप कर सकते हैं इस प्रकार की परीक्षा है कि क्या आम उपसर्ग पथ में से एक, यानी अगर पथ में से एक एक आम पूर्वज है:
paths = […, …, …]
common_prefix = os.path.commonprefix(list_of_paths)
if common_prefix in paths:
…
फिर आप सापेक्ष पथ पा सकते हैं:
relative_paths = [os.path.relpath(path, common_prefix) for path in paths]
तुम भी इस विधि के साथ, अधिक से अधिक दो रास्ते संभाल कर सकते हैं, और परीक्षण सभी रास्ते सभी उनमें से एक से नीचे हैं या नहीं।
पुनश्च : कैसे अपने रास्तों की तरह लग रही पर निर्भर करता है, तो आपको पहले कुछ सामान्य प्रदर्शन करने के लिए चाहते हो सकता है (जहां एक नहीं जानता है कि क्या वे हमेशा के साथ समाप्त इस स्थितियों में उपयोगी है '/' है या नहीं, या अगर रास्तों में से कुछ रिश्तेदार हैं)। प्रासंगिक कार्यों में शामिल हैं os.path.abspath () और os.path.normpath () ।
PPS : जैसा कि पीटर ब्रिग्स ने टिप्पणियों में उल्लेख किया है, ऊपर वर्णित सरल दृष्टिकोण विफल हो सकता है:
>>> os.path.commonprefix(['/usr/var', '/usr/var2/log'])
'/usr/var'
भले ही /usr/varहै नहीं रास्तों में से एक आम उपसर्ग। commonprefix()इस (विशिष्ट) समस्या को हल करने से पहले सभी रास्तों को '/' के साथ समाप्त करने के लिए मजबूर करना ।
PPPS : जैसा कि bluenote10 ने उल्लेख किया है, स्लैश जोड़ने से सामान्य समस्या हल नहीं होती है। यहाँ उसका अनुवर्ती प्रश्न है: पायथन की os.path.commonprefix की गिरावट को कैसे दरकिनार किया जाए?
PPPPS : पायथन 3.4 के साथ शुरू, हमारे पास पाथलिब है , एक मॉड्यूल है जो एक मार्ग मार्ग हेरफेर वातावरण प्रदान करता है। मेरा अनुमान है कि रास्तों के एक समूह का सामान्य उपसर्ग प्रत्येक पथ के सभी उपसर्गों को प्राप्त करने के साथ प्राप्त किया जा सकता है (साथ PurePath.parents()), इन सभी माता-पिता के सेट के प्रतिच्छेदन को लेते हुए, और सबसे लंबे आम उपसर्ग का चयन करें।
PPPPPS : पायथन 3.5 ने इस प्रश्न का उचित समाधान पेश किया: os.path.commonpath()जो एक वैध मार्ग देता है।