अजगर: निर्देशिका दो स्तरों को प्राप्त करें


86

ठीक है ... मुझे नहीं पता कि मॉड्यूल कहाँ xहै, लेकिन मुझे पता है कि मुझे निर्देशिका को दो स्तरों तक जाने की आवश्यकता है।

तो, वहाँ एक और अधिक सुंदर तरीका है:

import os
two_up = os.path.dirname(os.path.dirname(__file__))

पायथन 2 और 3 दोनों के लिए समाधान स्वागत योग्य है!


1
मुझे लगता है कि आपका समाधान पूरी तरह से ठीक है। एक pathlibसमाधान थोड़ा अच्छा और अधिक पठनीय है, लेकिन पायथन 2.7 के साथ शामिल नहीं है। मैं कहता हूं कि आपको जो मिला है, वह शायद एक टिप्पणी है।
जेम

शायद pip install pathlib22.7 में विवेक बनाए रखने के विकल्प को जोड़ने के लायक है ।
जोनाथन

जवाबों:


104

आप उपयोग कर सकते हैं pathlib। दुर्भाग्य से यह केवल पायथन में 3.4 के लिए उपलब्ध है। यदि आपके पास एक पुराना संस्करण है, तो आपको यहां PyPI से एक प्रति स्थापित करनी होगी । यह प्रयोग करने में आसान होना चाहिए pip

from pathlib import Path

p = Path(__file__).parents[1]

print(p)
# /absolute/path/to/two/levels/up

यह उस parentsअनुक्रम का उपयोग करता है जो मूल निर्देशिकाओं तक पहुंच प्रदान करता है और दूसरा को चुनता है।

ध्यान दें कि pइस मामले में Pathऑब्जेक्ट का कोई रूप होगा , अपने स्वयं के तरीकों के साथ। यदि आपको स्ट्रिंग के रूप में पथों की आवश्यकता है तो आप उन strपर कॉल कर सकते हैं।


एक अच्छा जवाब धन्यवाद और py3 के लिए महान। Py2 के लिए यह मेरे शुरुआती प्रयास से बेहतर नहीं है क्योंकि यह बनाता है और अतिरिक्त निर्भरता
jramm

16
यह स्वीकृत उत्तर नहीं होना चाहिए क्योंकि Pathकक्षा का parentsनिष्पादन स्थान पर निर्भर है। यदि आप __file__अपनी वर्तमान निर्देशिका से अपना निष्पादन करते हैं तो Pathकक्षा में कोई अभिभावक नहीं होगा। या तो @ सेबी 2020 के उत्तर को स्वीकार किया जाना चाहिए, या आपकी मूल विधि का उपयोग किया जाना चाहिए। मेरा मानना ​​है कि आपकी मूल विधि अधिक पठनीय है।
रेड-ट्यून -84

1
आपको करने की आवश्यकता हो सकती हैp = Path(os.path.abspath(__file__)).parents[1]
एडम राउडोनीस

4
@AdamRaudonis के बजाय os.path.abspath, आप भी इस्तेमाल कर सकते हैंPath(__file__).resolve().parents[1]
Tulio Casagrande

7
जैसा @Kazanz ने उल्लेख किया है, यह समाधान अन्य रास्तों से निष्पादित करते समय काम नहीं करता है। सबसे अच्छा समाधान है: p = Path(__file__).resolve().parents[1]। मैंने इसे एक उत्तर के रूप में भी जोड़ा।
9

46

बहुत आसान:

यहाँ आप क्या चाहते हैं:

import os.path as path

two_up =  path.abspath(path.join(__file__ ,"../.."))

8
और शायद के os.pardirबजाय का उपयोग करें ..
jme

क्या sys.argv [0] मॉड्यूल नहीं है जो python.exe द्वारा चलाया गया था? अगर मॉड्यूल im में दिलचस्पी रखने वाले किसी अन्य पैकेज से आयात किया गया था तो यह आवश्यक काम नहीं होगा..मैं यहीं हूं?
jramm

यदि आप इसका उपयोग करने के बजाय एक मॉड्यूल में उपयोग करना चाहते हैं __file__
सेबी २०२०

1
@jme आपको एक OS पता है जहाँ आपको ".." की तुलना में एक और स्ट्रिंग के साथ मूल निर्देशिका मिलती है ???
सेबी २०२०

1
@ Sebi2020 हां, विशेष रूप से पुराने मैक ओएस। यहाँ एक सूची है: en.wikipedia.org/wiki/Path_(computing)
jme

22

मैं इसे सिर्फ मूर्खतापूर्ण तरीके से जोड़ने जा रहा था, बल्कि इसलिए भी कि इससे नए लोगों को अलियासिंग कार्यों और / या आयातों की संभावित उपयोगिता का पता चलता है।

इसे लिखे जाने के बाद, मुझे लगता है कि यह कोड आज के अन्य उत्तरों की तुलना में अधिक पठनीय (यानी कम समय का इरादा) है, और पठनीयता (आमतौर पर) राजा है।

from os.path import dirname as up

two_up = up(up(__file__))

नोट: आप केवल इस तरह का काम करना चाहते हैं यदि आपका मॉड्यूल बहुत छोटा है, या प्रासंगिक रूप से सामंजस्यपूर्ण है।


14

किसी भी निर्देशिका से निष्पादित करते समय सबसे अच्छा समाधान (अजगर के लिए = 3.4):

from pathlib import Path
two_up = Path(__file__).resolve().parents[1]

10

निर्देशिका को 2 स्तरों तक प्राप्त करने के लिए:

 import os.path as path
 two_up = path.abspath(path.join(os.getcwd(),"../.."))

4

व्यक्तिगत रूप से, मुझे लगता है कि ओएस मॉड्यूल का उपयोग करना सबसे आसान तरीका है जैसा कि नीचे उल्लिखित है। यदि आप केवल एक स्तर पर जा रहे हैं, तो ('..') को '(..') से बदलें।

    import os
    os.chdir('../..')

--Check:
    os.getcwd()

1
क्या यह हार्डकोड स्वीकार्य है '' / 'मैंने os.chdir (os.join (' .. ',' .. ') को पढ़ने की उम्मीद की है
ग्रीनएजजेड

2

मैंने पाया है कि निम्नलिखित 2.7.x में अच्छी तरह से काम करता है

import os
two_up = os.path.normpath(os.path.join(__file__,'../'))

1

आप इसे एक सामान्य समाधान के रूप में उपयोग कर सकते हैं:

import os

def getParentDir(path, level=1):
  return os.path.normpath( os.path.join(path, *([".."] * level)) )

@ जानसीला: अधिक विशिष्ट हो सकता है, यह अजगर क्यों नहीं है? पठनीयता के लिए, यह और अधिक टिप्पणियां कर सकता है जो यह करता है, हां - लेकिन अंत में यह मानक अजगर भाषा सुविधाओं का उपयोग कर रहा है, उदाहरण के लिए देखें stackoverflow.com/questions/36901
एक्सल हेदर

यह थोड़ा घना है, लेकिन मुझे नहीं लगता कि यह बहुत सार है और पठनीय नहीं है। यह यहां पोस्ट किए गए अन्य उत्तरों का सामान्यीकृत संस्करण है। मैं एक समारोह को लागू करने की आवश्यकता के बिना चीजों को करने का एक मानक पुस्तकालय तरीका चाहूंगा, हालांकि।
ryanjdillon

1

अधिक क्रॉस-प्लेटफॉर्म कार्यान्वयन होगा:

import pathlib
two_up = (pathlib.Path(__file__) / ".." / "..").resolve()

का उपयोग करना parentविंडोज पर समर्थित नहीं है। इसमें भी जोड़ने की आवश्यकता .resolve()है:

रास्ते को पूर्ण बनाएं, रास्ते में सभी सिम्बलिंक्स को हल करें और इसे भी सामान्य करें (उदाहरण के लिए स्लैश को बैकग्राउंड अंडर में बदलना)


2
क्या आपके पास parentविंडोज पर काम नहीं करने के लिए एक स्रोत है ? ऐसा लगता है कि यह टिप्पणी लिखने के बाद से कुछ समय के लिए तय किया गया है। यह विंडोज 10 पर पायथन 3.7.2 का उपयोग करके मेरे लिए ठीक काम करता है
नाथन

मैं parentअजगर के साथ विंडोज 10 पर काम कर सकता था 3.6.5। अजगर का कौन सा संस्करण आप @Zhukovgeen के बारे में बात कर रहे हैं?
ggulgulia

@ggulgulia मेरा मानना ​​है कि यह 3.7
ज़ुकोवग्रीन

0

मान लें कि आप xy दो फ़ोल्डर नाम के फ़ोल्डर को आपकी अजगर फ़ाइल तक पहुँचना चाहते हैं। यह मेरे और प्लेटफार्म के लिए स्वतंत्र काम करता है।

".././Xyz"


0

(pathlib.Path ('../../')) .resolve ()


काम कर रहे निर्देशिका मॉड्यूल के सापेक्ष पथ देता है
9

-1

मुझे अभी तक 2.7 के लिए एक व्यवहार्य उत्तर नहीं दिखाई देता है जिसे अतिरिक्त निर्भरता स्थापित करने की आवश्यकता नहीं है और फ़ाइल की निर्देशिका से भी शुरू होती है। यह सिंगल-लाइन समाधान के रूप में अच्छा नहीं है, लेकिन मानक उपयोगिताओं के उपयोग में कुछ भी गलत नहीं है।

import os

grandparent_dir = os.path.abspath(  # Convert into absolute path string
    os.path.join(  # Current file's grandparent directory
        os.path.join(  # Current file's parent directory
            os.path.dirname(  # Current file's directory
                os.path.abspath(__file__)  # Current file path
            ),
            os.pardir
        ),
        os.pardir
    )
)

print grandparent_dir

और यह साबित करने के लिए कि यहाँ, मैं अभी शुरू करता हूँ ~/Documents/notesताकि मैं दिखाऊं कि वर्तमान निर्देशिका परिणाम को प्रभावित नहीं करती है। मैंने grandpa.pyउस स्क्रिप्ट के साथ "स्क्रिप्ट" नामक फ़ोल्डर में फ़ाइल डाल दी । यह दस्तावेज़ों के लिए क्रॉल करता है और फिर मैक पर उपयोगकर्ता के लिए dir होता है।

(testing)AlanSE-OSX:notes AlanSE$ echo ~/Documents/scripts/grandpa.py 
/Users/alancoding/Documents/scripts/grandpa.py
(testing)AlanSE-OSX:notes AlanSE$ python2.7 ~/Documents/scripts/grandpa.py 
/Users/alancoding

यह माता-पिता के लिए उत्तर का स्पष्ट निर्गमन है । कम लाइनों में एक अच्छे समाधान की तुलना में सामान्य समाधान का उपयोग करना बेहतर है।


-1

py 3.4 और ऊपर, pathlib के लिए

उदाहरण:

from pathlib import Path
path = Path("../../data/foo/someting.csv").resolve()

यह काम करने वाली निर्देशिका के सापेक्ष पथ देता है, मॉड्यूल नहीं
jramm
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.