पैरेंट डीर लोकेशन कैसे प्राप्त करें


131

इस कोड को बीकॉम में टेम्प्लेट / ब्लॉग 1 / पेज.html प्राप्त होता है:

path = os.path.join(os.path.dirname(__file__), os.path.join('templates', 'blog1/page.html'))

लेकिन मैं माता-पिता की डीआईआर स्थान प्राप्त करना चाहता हूं:

aParent
   |--a
   |  |---b.py
   |      |---templates
   |              |--------blog1
   |                         |-------page.html
   |--templates
          |--------blog1
                     |-------page.html

और aParent लोकेशन कैसे प्राप्त करें

धन्यवाद

अद्यतन:

यह सही है:

dirname=os.path.dirname
path = os.path.join(dirname(dirname(__file__)), os.path.join('templates', 'blog1/page.html'))

या

path = os.path.abspath(os.path.join(os.path.dirname(__file__),".."))

2
तो आप प्राप्त करना चाहते हैं blog1या a? और आपकी वर्तमान फ़ाइल कहाँ स्थित है?
फेलिक्स क्लिंग ने

क्या आप समझते हैं कि आपका कोड क्या कर रहा है?
साइलेंटगॉस्ट

1
हाँ, यह टेम्पलेट्स / blog1 / page.html मिल
zjm1126

os.path.join('templates', 'blog1/page.html')मुझे अजीब लगता है। आप चीजों को मिला रहे हैं। या तो os.path.join('templates', 'blog1', 'page.html')या 'templates/blog1/page.html'। और भी बहुत आसान होगा os.path.abspath(os.path.join('templates', 'blog1', 'page.html'))तो
फेलिक्स Kling

1
@zjm: नहीं, आपको वह पेज नहीं मिलता है। यह कुछ ब्लैकबॉक्स नहीं है जिसका उपयोग आप टेम्पलेट फ़ाइल प्राप्त करने के लिए कर सकते हैं। यह तुच्छ छोटे चरणों की एक श्रृंखला करता है, और यदि आप उन्हें समझ सकते हैं, तो आपके पास यह सवाल नहीं होगा।
साइलेंटगॉस्ट

जवाबों:


173

आप उच्च चढ़ाई करने के लिए बार-बार dirname लगा सकते हैं dirname(dirname(file)):। यह केवल मूल पैकेज के रूप में दूर तक जा सकता है, हालांकि। यदि यह एक समस्या है, तो उपयोग os.path.abspathकरें dirname(dirname(abspath(file))):।


37
मुझे पता है कि ओपी को पता है dirname। यह सभी के लिए स्पष्ट नहीं है कि निर्देशिका में dirname लागू करने से मूल निर्देशिका प्राप्त होती है।
मार्सेलो कैंटोस

4
dirnameहमेशा मूल निर्देशिका वापस नहीं करता है ; twitter.com/#//ctiveState/status/671049326788608
श्रीधर रत्नाकुमार

2
@ श्रीधर: जो आपके दृष्टिकोण पर निर्भर करता है; मैं /पत्ती निर्देशिका प्रविष्टि का प्रतिनिधित्व नहीं करने के रूप में समाप्त होने वाले मार्ग पर विचार करता हूं , लेकिन इसकी सामग्री, जो कि है, उदाहरण के लिए, mv xxx yyy/अगर yyyयह एक अजीब निर्देशिका नहीं है तो विफल रहता है। किसी भी मामले में, भले ही हम एक बिंदु के रूप में आपकी बात लें, यह मेरे उत्तर के संदर्भ में अप्रासंगिक है। न तो कभी भी fileपरिणाम का dirnameअंत होगा /
मार्सेलो कैंटोस

1
मामूली सुधार: dirnameवापसी हो सकती है '/', जो स्पष्ट रूप से एक में समाप्त होती है /। यह एकमात्र अपवाद है, AFAIK।
मार्सेलो कैंटोस

55

os.path.abspathकुछ भी मान्य नहीं करता है, इसलिए यदि हम पहले से ही तार जोड़ रहे हैं तो इसके __file__साथ dirnameया इसमें से किसी को भी परेशान करने की आवश्यकता नहीं है। बस __file__एक निर्देशिका के रूप में व्यवहार करें और चढ़ाई शुरू करें:

# climb to __file__'s parent's parent:
os.path.abspath(__file__ + "/../../")

के os.path.abspath(os.path.join(os.path.dirname(__file__),".."))रूप में और प्रबंधनीय के रूप में के बारे में अभी तक कम जटिल है dirname(dirname(__file__))। दो से अधिक स्तरों पर चढ़ना हास्यास्पद होने लगता है।

लेकिन, जब से हम जानते हैं कि कितने स्तरों पर चढ़ना है, हम इसे एक साधारण छोटे कार्य के साथ साफ कर सकते हैं:

uppath = lambda _path, n: os.sep.join(_path.split(os.sep)[:-n])

# __file__ = "/aParent/templates/blog1/page.html"
>>> uppath(__file__, 1)
'/aParent/templates/blog1'
>>> uppath(__file__, 2)
'/aParent/templates'
>>> uppath(__file__, 3)
'/aParent'

2
यह अच्छा है, लेकिन यह भी अच्छा होगा यदि मानक पुस्तकालय ने एक सुविधा फ़ंक्शन जोड़ा है जो इसे पूरा करता है ... हर बार मुझे एसओ पर नहीं आना चाहिए मुझे इस func की आवश्यकता है
gradi3nt

4
os.path.abspath(os.path.join(__file__, "..", "..")अधिक पोर्टेबल होगा ?
धीमी गति से

40

पायथन 3.4+ में मॉड्यूल के साथ सापेक्ष पथ का उपयोग करें pathlib:

from pathlib import Path

Path(__file__).parent

parentपथ में आगे जाने के लिए आप कई कॉल का उपयोग कर सकते हैं :

Path(__file__).parent.parent

parentदो बार निर्दिष्ट करने के विकल्प के रूप में , आप उपयोग कर सकते हैं:

Path(__file__).parents[1]

2
यदि आपको एक स्ट्रिंग के रूप में पथ की आवश्यकता है क्योंकि आप इसे संशोधित करना चाहते हैं, तो आप बस उपयोग कर सकते हैं str(Path(__file__).parent)
फिलिप

12
os.path.dirname(os.path.abspath(__file__))

आपको रास्ता देना चाहिए a

लेकिन अगर b.pyवर्तमान में निष्पादित की गई फ़ाइल है, तो आप बस कर के ही प्राप्त कर सकते हैं

os.path.abspath(os.path.join('templates', 'blog1', 'page.html'))

1
ओ, मुझे पता है, आप सही हैं, और मैं एक माता-पिता फ़ोल्डर प्राप्त करना चाहता हूं। इसे कैसे प्राप्त करें
zjm1126

@ zjm1126: मार्सेलो कैंटोस का उत्तर देखें। dirname()दो बार आवेदन करें । अब आपको जो कुछ भी चाहिए वह इस साइट पर होना चाहिए।
फेलिक्स क्लिंग ने

9

os.pardir../और अधिक पठनीय के लिए एक बेहतर तरीका है ।

import os
print os.path.abspath(os.path.join(given_path, os.pardir))  

यह दिए गए_पथ का मूल पथ लौटा देगा


5

एक सरल तरीका हो सकता है:

import os
current_dir =  os.path.abspath(os.path.dirname(__file__))
parent_dir = os.path.abspath(current_dir + "/../")
print parent_dir

3

..पैरेंट फ़ोल्डर के माता-पिता को पाने के लिए दो फ़ोल्डर में शामिल हो सकते हैं ?

path = os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__)),"..",".."))

3

पिछले फ़ोल्डर में जाने के लिए निम्नलिखित का उपयोग करें:

os.chdir(os.pardir)

यदि आपको कई जंप की आवश्यकता है तो इस मामले में एक साधारण डेकोरेटर का उपयोग करना एक अच्छा और आसान उपाय होगा।


1

यहाँ एक और सरल समाधान है कि:

  • का उपयोग नहीं करता है dirname()(जो "file.txt" या रिश्तेदार माता-पिता जैसे ".." की तरह एक स्तर के तर्क पर अपेक्षित काम नहीं करता है)
  • का उपयोग नहीं करता है abspath()(वर्तमान कार्यशील निर्देशिका के बारे में किसी भी धारणा से बचने) लेकिन पथ के सापेक्ष चरित्र को संरक्षित करता है

यह सिर्फ उपयोग करता है normpathऔर join:

def parent(p):
    return os.path.normpath(os.path.join(p, os.path.pardir))

# Example:
for p in ['foo', 'foo/bar/baz', 'with/trailing/slash/', 
        'dir/file.txt', '../up/', '/abs/path']:
    print parent(p)

परिणाम:

.
foo/bar
with/trailing
dir
..
/abs

0

मुझे लगता है कि यह उपयोग बेहतर है:

os.path.realpath(__file__).rsplit('/', X)[0]


In [1]: __file__ = "/aParent/templates/blog1/page.html"

In [2]: os.path.realpath(__file__).rsplit('/', 3)[0]
Out[3]: '/aParent'

In [4]: __file__ = "/aParent/templates/blog1/page.html"

In [5]: os.path.realpath(__file__).rsplit('/', 1)[0]
Out[6]: '/aParent/templates/blog1'

In [7]: os.path.realpath(__file__).rsplit('/', 2)[0]
Out[8]: '/aParent/templates'

In [9]: os.path.realpath(__file__).rsplit('/', 3)[0]
Out[10]: '/aParent'

बिल्कुल नहीं, यह ओएस पर निर्भर है (विंडोज पर काम नहीं करेगा)। इसके अलावा यह रिश्तेदार रास्तों का उपयोग करने की अनुमति नहीं देता है।
kgadek

यह एक भयानक समाधान है।
web.learner

0

मैंने कोशिश की:

import os
os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))), os.pardir))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.