python - w3schools - পাইথন: দুটি পরম পথ তুলনা করে আপেক্ষিক পথ পান
python w3schools (4)
বলুন, আমার দুটি পরম পথ আছে। আমি পাথ এক দ্বারা উল্লেখ করে অবস্থান অন্য একটি বংশধর কিনা তা পরীক্ষা করতে হবে। যদি সত্য হয়, আমি পূর্বপুরুষ থেকে বংশধর আপেক্ষিক পথ খুঁজে বের করতে হবে। Python এই বাস্তবায়ন করার একটি ভাল উপায় কি? আমি যে কোন লাইব্রেরি থেকে উপকৃত হতে পারি?
আমি python2 এবং w / o কোনো বহিরাগত নির্ভরতা সঙ্গে একটি সমাধান জন্য লাগছিল। আমার চাহিদা মিলে কিছু খুঁজে পাইনি। এবং যখন কমপ্রিফিক্স, কেবল স্ট্রিংগুলির সাথে তুলনা করে এবং পাথরগুলি নয়, আমি এটি লিখেছি:
def _relpath(cwd, path):
# Create a relative path for path from cwd, if possible
if sys.platform == "win32":
cwd = cwd.lower()
path = path.lower()
_cwd = os.path.abspath(cwd).split(os.path.sep)
_path = os.path.abspath(path).split(os.path.sep)
equal_until_pos = None
for i in xrange(min(len(_cwd), len(_path))):
if _cwd[i] != _path[i]:
break
else:
equal_until_pos = i
if equal_until_pos is None:
return path
newpath = [".." for i in xrange(len(_cwd[equal_until_pos + 1:]))]
newpath.extend(_path[equal_until_pos + 1:])
if newpath:
return os.path.join(*newpath)
return "."
কোন মন্তব্য স্বাগত জানাই!
আরেকটি বিকল্প হয়
>>> print os.path.relpath('/usr/var/log/', '/usr/var')
log
বর্তমান ডিরেক্টরি থেকে অথবা একটি ঐচ্ছিক শুরু বিন্দু থেকে পাথের একটি আপেক্ষিক filepath ফিরে।
>>> from os.path import relpath
>>> relpath('/usr/var/log/', '/usr/var')
'log'
>>> relpath('/usr/var/log/', '/usr/var/sad/')
'../log'
সুতরাং, যদি আপেক্ষিক পথ '..'
দিয়ে শুরু হয় - এর অর্থ হল দ্বিতীয় পথটি প্রথম পথের বংশধর নয়।
পাইথন 3 এ আপনি PurePath.relative_to ব্যবহার করতে পারেন:
Python 3.5.1 (default, Jan 22 2016, 08:54:32)
>>> from pathlib import Path
>>> Path('/usr/var/log').relative_to('/usr/var/log/')
PosixPath('.')
>>> Path('/usr/var/log').relative_to('/usr/var/')
PosixPath('log')
>>> Path('/usr/var/log').relative_to('/etc/')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/lib/python3.5/pathlib.py", line 851, in relative_to
.format(str(self), str(formatted)))
ValueError: '/usr/var/log' does not start with '/etc'
সম্পাদনা করুন: পাইথন 3 এর সাথে সর্বোত্তম উপায়ে জেমের উত্তরটি দেখুন।
Pathlib ব্যবহার করে, আপনি নিম্নলিখিত সমাধান আছে:
আসুন আমরা বলি যে son
parent
বংশধর কিনা এবং উভয়ই Path
বস্তু কিনা তা পরীক্ষা করতে চাই। আমরা list(parent.parts)
সঙ্গে পাথ অংশ অংশ পেতে পারেন। তারপরে, আমরা কেবলমাত্র সন্তানের সূচনাটি পিতামাতার সেগমেন্টের তালিকার সমান।
>>> lparent = list(parent.parts)
>>> lson = list(son.parts)
>>> if lson[:len(lparent)] == lparent:
>>> ... #parent is a parent of son :)
আপনি অবশিষ্ট অংশ পেতে চান, আপনি শুধু করতে পারেন
>>> ''.join(lson[len(lparent):])
এটি একটি স্ট্রিং, তবে আপনি অবশ্যই এটি অন্য পাথ বস্তুর কন্সট্রাকটর হিসাবে ব্যবহার করতে পারেন।