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


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.