पायथन के os.path का उपयोग करते हुए, मैं एक निर्देशिका कैसे बढ़ाऊं?


224

मैं हाल ही में Django को v1.3.1 से v1.4 में अपग्रेड करता हूं।

मेरे पुराने में settings.pyमेरे पास है

TEMPLATE_DIRS = (
    os.path.join(os.path.dirname( __file__ ), 'templates').replace('\\', '/'),
    # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
    # Always use forward slashes, even on Windows.
    # Don't forget to use absolute paths, not relative paths.
)

यह इंगित करेगा /Users/hobbes3/Sites/mysite/templates, लेकिन क्योंकि Django v1.4 ऐप फ़ोल्डर के रूप में प्रोजेक्ट फ़ोल्डर को उसी स्तर पर ले गया , मेरी settings.pyफ़ाइल अब /Users/hobbes3/Sites/mysite/mysite/इसके बजाय है /Users/hobbes3/Sites/mysite/

तो वास्तव में मेरा सवाल अब दुगना है:

  1. मैं os.pathएक निर्देशिका को एक स्तर से ऊपर देखने के लिए कैसे उपयोग कर सकता हूं __file__। दूसरे शब्दों में, मैं चाहता हूँ /Users/hobbes3/Sites/mysite/mysite/settings.pyलगता है /Users/hobbes3/Sites/mysite/templatesसंबंधित पथ का उपयोग कर।
  2. मैं रखने होना चाहिए templateफ़ोल्डर (जो पार एप्लिकेशन टेम्पलेट्स, की तरह है admin, registrationपरियोजना में, आदि) /User/hobbes3/Sites/mysiteके स्तर या कम से /User/hobbes3/Sites/mysite/mysite?

कठबोली तुम सिर्फ करने के osलिए उपयोग करते cdहैं ../mysite? या जो कुछ भी आप चाहते हैं
prelic

@ हम्मीर हम्म? मुझे समझ नहीं आ रहा है। मैं पथ को हार्डकोड करने से बचने की कोशिश कर रहा हूं, क्योंकि मैं settings.pyकई सर्वरों में समान उपयोग करता हूं । एकमात्र अंतर डेटाबेस क्रेडेंशियल्स हो सकता है। मैं os.pathदस्तावेज़ीकरण पढ़ रहा था, लेकिन मुझे एक आदेश नहीं मिला कि चलो तुम एक निर्देशिका जाओ। की तरह cd ..
hobbes3

2
@ hobbes3 आप केवल फाइलसिस्टम भर में ऊपर निर्देशिका काos.path.join( os.path.dirname( __file__ ), '..' ) .. मतलब कर सकते हैं , न कि केवल जब पारित किया जाता है । cd
माइकल बेर्कोव्स्की

3
@ os.path.join( os.path.dirname ( __file__), os.path.pardir)
मिचेल

जवाबों:


285
os.path.abspath(os.path.join(os.path.dirname( __file__ ), '..', 'templates'))

जहाँ तक टेम्प्लेट फ़ोल्डर जाना चाहिए, मुझे नहीं पता है कि Django 1.4 अभी-अभी बाहर आया है और मैंने अभी तक इसे नहीं देखा है। आपको शायद उस मुद्दे को हल करने के लिए एसई पर एक और सवाल पूछना चाहिए।

आप normpathइसके बजाय पथ को साफ करने के लिए भी उपयोग कर सकते हैं abspath। हालाँकि, इस स्थिति में, Django एक सापेक्ष पथ के बजाय एक पूर्ण पथ की अपेक्षा करता है।

पार मंच संगतता के लिए, के os.pardirबजाय का उपयोग करें '..'


4
क्या इसका उपयोग करना बुरा है ..या कुछ और? इस जवाब को कम वोट क्यों मिल रहे हैं?
hobbes3

1
मुझे नहीं पता कि इसे कम वोट क्यों मिल रहे हैं, लेकिन यह वही है जो मैंने हमेशा इस्तेमाल किया है। यह उदाहरण के लिए भी परिभाषित किया गया है normpath। इसके अलावा, यह ठीक से सहानुभूति को पीछे छोड़ देगा।
forivall

1
Abspath का उपयोग करने से यह थोड़ा साफ हो जाएगा। यदि यह नहीं है, तो पथ के नाम के लिए वास्तविक स्ट्रिंग होगी /Users/hobbes3/Sites/mysite/mysite/../templates, जो पूरी तरह से ठीक है, लेकिन बस थोड़ा और क्लॉटेड है। यह भी सुनिश्चित करता है कि Django के निरपेक्ष रास्तों का उपयोग करने के अनुस्मारक का पालन किया जाता है। यदि आप एक अलग स्थिति में हैं जो एक रिश्तेदार पथ का उपयोग करता है, तो आपको अपने पथ को सरल बनाने के लिए मानदंड का उपयोग करना चाहिए।
forivall

2
यह सवाल सिर्फ Django के नए संस्करण के लिए फ़ोल्डर संरचना को माइग्रेट करने के बारे में पूछा गया था , इसलिए आपको संभवतः अपने दूसरे मुद्दे को हल करने के लिए देखना चाहिए।
forivall

1
@Zitrax क्या आप ऐसे किसी भी प्लेटफ़ॉर्म के बारे में जानते हैं जहाँ यह अलग होगा, या क्या यह भविष्य की सुरक्षा के लिए है? (मैं वास्तव में os.pardir, osडॉक्स के तल पर वास्तव में कभी नहीं गया था के बारे में नहीं जानता था )
19

98

किसी फ़ाइल के फ़ोल्डर का उपयोग करने के लिए:

os.path.dirname(path) 

एक फ़ोल्डर को प्राप्त करने के लिए बस os.path.dirnameफिर से उपयोग करें

os.path.dirname(os.path.dirname(path))

यदि आप __file__एक सिमलिंक है, तो आप जांचना चाहते हैं :

if os.path.islink(__file__): path = os.readlink (__file__)

17
क्या बार nकॉल किए बिना फोल्डर में जाने का कोई तरीका है os.path.dirname n?
ओरिओल नीटो

9
@OriolNieto हाँ, संस्करण पायथन 3.4+ के रूप में आप उपयोग कर सकते हैं pathlib.Path.parents[levels_up-1]। अधिक समाधान के लिए इस प्रश्न को देखें
jwalton

23

यदि आप पायथन 3.4 या नए का उपयोग कर रहे हैं, तो कई निर्देशिकाओं को स्थानांतरित करने का एक सुविधाजनक तरीका है pathlib:

from pathlib import Path

full_path = "path/to/directory"
str(Path(full_path).parents[0])  # "path/to"
str(Path(full_path).parents[1])  # "path"
str(Path(full_path).parents[2])  # "."

2
यह निश्चित रूप से सबसे साफ तरीका है।
hobbes3


9

व्यक्तिगत रूप से, मैं फंक्शन अप्रोच के लिए जाऊंगा

def get_parent_dir(directory):
    import os
    return os.path.dirname(directory)

current_dirs_parent = get_parent_dir(os.getcwd())

सावधान रहें कि यह उत्तर काम नहीं करता है यदि इनपुट में पीछे की ओर खिसकना शामिल है, जैसे os.path.dirname('/tmp/lala/')अभी भी वापस लौटना है'/tmp/lala'
फ्रूट

पीछे चल रहा स्लैश केस इस उत्तर को संदर्भित कर सकता है: stackoverflow.com/a/25669963/1074998
फ्रूट

7

मुझे लगता है कि करने के लिए सबसे आसान काम सिर्फ dirname () का पुन: उपयोग करना है

os.path.dirname(os.path.dirname( __file__ ))

यदि आप फ़ाइल /User/hobbes3/Sites/mysite/templates/method.py पर हैं

यह "/ उपयोगकर्ता / hobbes3 / साइट / mysite" लौटेगा


6
from os.path import dirname, realpath, join
join(dirname(realpath(dirname(__file__))), 'templates')

अपडेट करें:

यदि आप settings.pyसहानुभूति के माध्यम से "कॉपी" करते हैं, तो @ forivall का उत्तर बेहतर है:

~user/
    project1/  
        mysite/
            settings.py
        templates/
            wrong.html

    project2/
        mysite/
            settings.py -> ~user/project1/settings.py
        templates/
            right.html

ऊपर की विधि 'दिखाई' देगी wrong.htmlजबकि @ forivall की विधि देखेंगेright.html

सहानुभूति के अभाव में दो उत्तर समान होते हैं।


क्या इस दृष्टिकोण में कुछ गलत है? यह अच्छा काम करता है और अच्छा दिखता है, लेकिन थोड़ा
हैकिश

यह स्वीकृत उत्तर से थोड़ा अलग है कि यह लिंक के साथ कैसे व्यवहार करता है। वे अन्यथा समान हैं।
एंटनी हैचकिंस

6

यह अन्य मामलों के लिए उपयोगी हो सकता है जहां आप x फ़ोल्डर ऊपर जाना चाहते हैं। बस walk_up_folder(path, 6)6 फ़ोल्डर ऊपर जाने के लिए चलाएं ।

def walk_up_folder(path, depth=1):
    _cur_depth = 1        
    while _cur_depth < depth:
        path = os.path.dirname(path)
        _cur_depth += 1
    return path   

for _ in xrange(depth)स्थानीय चर का ट्रैक रखने के बजाय सिर्फ उपयोग कर सकता है ।
ज़िट्रैक्स

2

मेरे जैसे एक पागल के लिए, मैं इसे पसंद करूंगा

TEMPLATE_DIRS = (
    __file__.rsplit('/', 2)[0] + '/templates',
)

8
शायद इसके बजाय '/'आप का उपयोग करना चाहिएos.sep
djhaskin987

1

nफ़ोल्डर्स को ऊपर जाने के लिए ... चलाएँup(n)

import os

def up(n, nth_dir=os.getcwd()):
    while n != 0:
        nth_dir = os.path.dirname(nth_dir)
        n -= 1
    return nth_dir


0

उपयोग करने के साथ os.pathहम एक निर्देशिका को उस तरह से ऊपर जा सकते हैं

one_directory_up_path = os.path.dirname('.')

वह निर्देशिका ढूंढने के बाद भी जब आप चाहते हैं कि आप अन्य फ़ाइल / निर्देशिका पथ से जुड़ सकें

other_image_path = os.path.join(one_directory_up_path, 'other.jpg')
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.