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]
এমনকি আপনি এই পদ্ধতির সাহায্যে দুটিরও বেশি পাথ পরিচালনা করতে পারেন এবং পরীক্ষা করতে পারেন যে সমস্ত পাথগুলি তার একটির নীচে রয়েছে।
PS : আপনার পাথগুলি কেমন দেখাচ্ছে তার উপর নির্ভর করে আপনি প্রথমে কিছুটা সাধারণীকরণ করতে চাইতে পারেন (এটি এমন পরিস্থিতিতে কার্যকর যেগুলি সর্বদা '/' দিয়ে শেষ হয় কিনা তা জানে না বা কিছু পথ আপেক্ষিক কিনা)। প্রাসঙ্গিক ফাংশনগুলির মধ্যে os.path.abspath () এবং os.path.normpath () অন্তর্ভুক্ত রয়েছে ।
পিপিএস : পিটার ব্রিগেস মন্তব্যগুলিতে যেমন উল্লেখ করেছেন, উপরে বর্ণিত সহজ পদ্ধতি ব্যর্থ হতে পারে:
>>> os.path.commonprefix(['/usr/var', '/usr/var2/log'])
'/usr/var'
যদিও /usr/varহয় না পাথ একটি সাধারণ উপসর্গ। কল commonprefix()করার আগে সমস্ত পাথ '/' দিয়ে শেষ করতে বাধ্য করা এই (নির্দিষ্ট) সমস্যার সমাধান করে।
পিপিপিএস : ব্লুএনোট 10 হিসাবে উল্লেখ করা হয়েছে, স্ল্যাশ যুক্ত করা সাধারণ সমস্যার সমাধান করে না। এখানে তার ফলোআপ প্রশ্নটি রয়েছে: পাইথনের os.path.commonprefix এর মিথ্যাচার কীভাবে রোধ করা যায়?
পিপিপিপিএস : পাইথন ৩.৪ দিয়ে শুরু করে আমাদের কাছে প্যাথলিব রয়েছে , একটি মডিউল যা স্যানার পাথ হেরফের পরিবেশ সরবরাহ করে। আমি অনুমান করি যে প্রতিটি পাথের সমস্ত উপসর্গ (সহ PurePath.parents()) পেয়ে, এই সমস্ত প্যারেন্ট সেটগুলিকে ছেদ করে এবং দীর্ঘতম সাধারণ উপসর্গটি নির্বাচন করে পাথের সেটগুলির সাধারণ উপসর্গ পাওয়া যায়।
পিপিপিপিপিএস : পাইথন 3.5 এই প্রশ্নের যথাযথ সমাধান প্রবর্তন করেছে: এটি os.path.commonpath()একটি বৈধ পথ ফেরায় ।