पायथन में एक पथ का केवल अंतिम भाग कैसे प्राप्त करें?


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\\'(एक खाली स्ट्रिंग देता है) यह समाधान सभी मामलों के लिए काम करता है।
— ओमसौद

25

तुम यह कर सकते थे

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

UPDATE1: यह दृष्टिकोण उस स्थिति में काम करता है जब आप इसे /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)

UPDATE2: जैसा कि लार्स ने कहा, परिवर्तन कर रहे हैं ताकि अनुगामी '/' को समायोजित किया जा सके।

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

पायथन-थिंक में, os.path.basename ("... /") सही ढंग से '' पैदावार देता है। हां, मुझे भी, यह पता चलता है कि उप-इष्टतम। ... बेसन ... (मानदंड ... नीचे समाधान विहित है, हालांकि।
— कैमरून लेयर्ड

@ लार्स हाँ! बस देखा कि उस मामले में यह आधारभूत करने के लिए खिलाने से पहले पहले मार्ग को सामान्य करें। os.path.basename (os.path.normpath ('/ folderA / folderB / folderC / folderD /'))
— Srikar Appalaraju

UPDATE2 मुझे अब तक मिला सबसे अच्छा तरीका है।
— अक्की

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
उपर्युक्त की तुलना में आपका दृष्टिकोण क्या अलग / बेहतर हल करता है?
— user1767754

9

मैं अंतिम फ़ोल्डर का नाम पाने के लिए एक समाधान खोज रहा था जहां फ़ाइल स्थित है, मैंने splitसही भाग प्राप्त करने के लिए सिर्फ दो बार उपयोग किया है । यह सवाल नहीं है, लेकिन गूगल ने मुझे यहां स्थानांतरित कर दिया।

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

2

एक भोला समाधान (अजगर 2.5.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:]

कोई इसका उपयोग क्यों करेगा?
— Chris_Rands



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

वह चाहता है folderD। नहींfolderC
— श्रीकर अप्पाराजू

1
यह "folderD" देता है क्योंकि अनुगामी स्लैश सूची में अंतिम आइटम बनाता है ""
— neil

21
गंभीरता से, os.pathमॉड्यूल का उपयोग करें ।
— QUIT -
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.