পাইথনের কোনও পথের শেষ অংশটি কীভাবে পাবেন?


232

পাইথনে, ধরুন আমার এইরকম পথ রয়েছে:

/folderA/folderB/folderC/folderD/

আমি কীভাবে কেবল folderDঅংশটি পেতে পারি ?

উত্তর:


389

os.path.normpathতারপরে ব্যবহার করুন os.path.basename:

>>> os.path.basename(os.path.normpath('/folderA/folderB/folderC/folderD/'))
'folderD'

প্রথম কোনও স্ট্রিলিং স্ল্যাশগুলি সরানো হয়, দ্বিতীয়টি আপনাকে পথের শেষ অংশ দেয়। ব্যবহার কেবল basenameসর্বশেষ স্ল্যাশের পরে সমস্ত কিছু দেয় যা এই ক্ষেত্রে ''


1
আমি প্রথমদিকে ভেবেছিলাম rstrip('/')সহজ হবে তবে দ্রুত বুঝতে পারলাম আমার ব্যবহার করতে হবে rstrip(os.path.sep), সুতরাং স্পষ্টতই এর ব্যবহার normpathন্যায়সঙ্গত।
এরিক কাপলুন

এটি উইন্ডোজ দীর্ঘ পাথগুলিতে কাজ করে বলে মনে হয় না, যেমন, '\\\\?\\D:\\A\\B\\C\\'এবং '\\\\?\\UNC\\svr\\B\\C\\'(একটি খালি স্ট্রিং দেয়) এই সমাধানটি সমস্ত ক্ষেত্রেই কাজ করে।
omasoud

25

আপনি করতে পারেন

>>> import os
>>> os.path.basename('/folderA/folderB/folderC/folderD')

আপডেট আপডেট 1: আপনি এটিকে /folderA/folderB/folderC/folderD/xx.py দেওয়ার ক্ষেত্রে এই পদ্ধতির কাজ করে। এটি xx.py কে বেসনাম হিসাবে দেয়। আপনি যা চান তা আমার অনুমান নয়। সুতরাং আপনি এটি করতে পারে -

>>> import os
>>> path = "/folderA/folderB/folderC/folderD"
>>> if os.path.isdir(path):
        dirname = os.path.basename(path)

আপডেট 2: লারস যেমন উল্লেখ করেছেন, '/' অনুসরণের ব্যবস্থা করতে যাতে পরিবর্তন করা যায়।

>>> from os.path import normpath, basename
>>> basename(normpath('/folderA/folderB/folderC/folderD/'))
'folderD'

পাইথন-থিঙ্কে, os.path.basename ("... /") সঠিকভাবে ফলন দেয় ''। হ্যাঁ, আমিও সেই উপ-অনুকূলটি পাই। নীচে ... বেসনাম (... নর্ম্প্যাথ ... সমাধানটি প্রমিত, যদিও
ক্যামেরন লেয়ার্ড

@ আলার হ্যাঁ! সবেমাত্র দেখেছে যে বেসনকে খাওয়ানোর আগে প্রথমে পাথটিকে স্বাভাবিক করুন। os.path.basename (os.path.normpath ('/ ফোল্ডারএ / ফোল্ডারবি / ফোল্ডারসি / ফোল্ডারডি /'))
শ্রীকর অপালরাজু

আমি এখনও অবধি খুঁজে পেলাম UPDATE2 2
আক্কি

23

পাইথন 3 দিয়ে আপনি pathlibমডিউলটি ব্যবহার করতে পারেন ( pathlib.PurePathউদাহরণস্বরূপ):

>>> import pathlib

>>> path = pathlib.PurePath('/folderA/folderB/folderC/folderD/')
>>> path.name
'folderD'

আপনি যদি সর্বশেষ ফোল্ডারের নাম চান যেখানে কোনও ফাইল রয়েছে:

>>> path = pathlib.PurePath('/folderA/folderB/folderC/folderD/file.py')
>>> path.parent.name
'folderD'

18

এখানে আমার পদ্ধতি:

>>> import os
>>> print os.path.basename(
        os.path.dirname('/folderA/folderB/folderC/folderD/test.py'))
folderD
>>> print os.path.basename(
        os.path.dirname('/folderA/folderB/folderC/folderD/'))
folderD
>>> print os.path.basename(
        os.path.dirname('/folderA/folderB/folderC/folderD'))
folderC

1
আপনার পদ্ধতির উপরে উল্লিখিতগুলির চেয়ে আলাদা / ভাল কী সমাধান হবে?
ব্যবহারকারী 1767754

9

আমি ফাইলটি যেখানে রয়েছে সেখানে সর্বশেষ ফোল্ডারনামটি পেতে একটি সমাধান অনুসন্ধান করছিলাম, আমি splitসঠিক অংশটি পেতে দুটি বার ব্যবহার করেছি । এটি প্রশ্ন নয় তবে গুগল আমাকে এখানে স্থানান্তর করেছে।

pathname = "/folderA/folderB/folderC/folderD/filename.py"
head, tail = os.path.split(os.path.split(pathname)[0])
print(head + "   "  + tail)

2

একটি নিষ্পাপ সমাধান (পাইথন ২.২.২++):

s="/path/to/any/folder/orfile"
desired_dir_or_file = s[s.rindex('/',0,-1)+1:-1] if s.endswith('/') else s[s.rindex('/')+1:]

কেউ কেন এটি ব্যবহার করবে?
ক্রিস_আরেন্ডস



0
str = "/folderA/folderB/folderC/folderD/"
print str.split("/")[-2]

সে চায় folderD। নয়folderC
শ্রীকর অপালরাজু

1
এটি "ফোল্ডারডি" দেয় কারণ পিছনের স্ল্যাশ তালিকার চূড়ান্ত আইটেমটিকে "" করে তোলে
নিল

21
সিরিয়াসলি, os.pathমডিউলটি ব্যবহার করুন ।
কিট আছে - অ্যানি-মৌসে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.