পাইথনের Os.path ব্যবহার করে, আমি কীভাবে একটি ডিরেক্টরিতে যেতে পারি?


224

আমি সম্প্রতি জ্যাঙ্গোকে 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, কিন্তু যেহেতু জাজানো ভি 1.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? অথবা আপনি যে কোনও আদেশ চান
23

@ পূর্বলিক হুঁ? আমি বুঝতে পারছি না। আমি পথটি হার্ডকোডিং এড়ানোর চেষ্টা করছি, কারণ আমি 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'))

টেমপ্লেটস ফোল্ডারটি কোথায় যাওয়া উচিত, আমি জানি না যেহেতু জ্যাঙ্গো ১.৪ বেরিয়েছে এবং আমি এখনও এটির দিকে নজর দিইনি। এই সমস্যাটি সমাধান করার জন্য আপনার সম্ভবত এসই সম্পর্কিত আরও একটি প্রশ্ন করা উচিত।

আপনি normpathবরং এই পথটি পরিষ্কার করার জন্য ব্যবহার করতে পারেন abspath। যাইহোক, এই পরিস্থিতিতে, জাঙ্গো আপেক্ষিক পথের পরিবর্তে একটি নিখুঁত পথের প্রত্যাশা করে।

ক্রস প্ল্যাটফর্মের সামঞ্জস্যের জন্য, os.pardirপরিবর্তে ব্যবহার করুন '..'


4
এটি ব্যবহার করা খারাপ ধারণা ..বা কিছু? কেন এই উত্তর কম ভোট পাচ্ছে?
hobbes3

1
আমি জানি না কেন এটি কম ভোট পাচ্ছে, তবে এটি আমি সর্বদা ব্যবহার করেছি। এমনকি উদাহরণ হিসাবে এটি সংজ্ঞায়িত করা হয় normpath। এছাড়াও, এটি সঠিকভাবে প্রতিলিঙ্কগুলি অতিক্রম করবে।
ফরিভাল

1
অ্যাবস্পাথ ব্যবহার করলে এটি কিছুটা পরিষ্কার হয়ে যাবে। যদি এটি সেখানে না থাকে তবে পথের নামের প্রকৃত স্ট্রিংটি হবে /Users/hobbes3/Sites/mysite/mysite/../templatesযা পুরোপুরি ভাল, তবে আরও কিছুটা বিশৃঙ্খলা। এটিও নিশ্চিত করে যে পরম পাথগুলি ব্যবহার করার জন্য জ্যাঙ্গোর অনুস্মারকটি মান্য হয়েছে। আপনি যদি কোনও ভিন্ন পরিস্থিতিতে থাকেন যা আপেক্ষিক পথ ব্যবহার করে, পরিবর্তে আপনার পথগুলি সরল করার জন্য আপনার আদর্শ ব্যবহার করা উচিত।
25-25

2
এই প্রশ্নটি জাজানোয়ের নতুন সংস্করণটির জন্য স্থানান্তরিত ফোল্ডার কাঠামোর বিষয়ে জিজ্ঞাসা করা হয়েছিল , সুতরাং আপনার দ্বিতীয় সমস্যা সমাধানের জন্য আপনার সম্ভবত সেই দিকে নজর দেওয়া উচিত।
ফরিভাল

1
@ জিত্রাক্স আপনি কি এমন কোনও প্ল্যাটফর্ম সম্পর্কে জানেন যেখানে এটি আলাদা হবে, বা ভবিষ্যতের সুরক্ষার জন্য এটি কেবল সেখানে রয়েছে? (আমি আসলে সম্পর্কে কিছুই জানতাম না, প্রকৃতপক্ষে os.pardirকখনই osডক্সের নীচে
পৌঁছতে পারিনি

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
@ অরিওলনিয়েটো হ্যাঁ, সংস্করণ হিসাবে পাইথন ৩.৪+ আপনি ব্যবহার করতে পারেন pathlib.Path.parents[levels_up-1]। আরও সমাধানের জন্য এই প্রশ্নটি দেখুন
jwalton

23

আপনি যদি পাইথন ৩.৪ বা তার চেয়ে বেশি নতুন ব্যবহার করে থাকেন তবে একাধিক ডিরেক্টরি আপলোড করার একটি সুবিধাজনক উপায় হ'ল 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

আমি মনে করি সবচেয়ে সহজ কাজটি হ'ল ডারনামটি পুনরায় ব্যবহার করা () যাতে আপনি কল করতে পারেন

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

আপনি যদি ফাইলটি ব্যবহার করেন / ব্যবহারকারী / হবিস 3 / সাইটস / মাইসাইট / টেম্পলেটস / মেমোডি.পি

এটি "/ ব্যবহারকারী / হবিস 3 / সাইটস / মাইসাইট" ফিরিয়ে দেবে


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

হালনাগাদ:

আপনি যদি settings.pyসিমলিংকের মাধ্যমে "অনুলিপি" করেন তবে @ ফরিভালের উত্তর আরও ভাল:

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

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

উপরের পদ্ধতিটি 'দেখবে' wrong.htmlযখন @ ফরিভালের পদ্ধতিটি দেখতে পাবেright.html

সিমলিংকের অনুপস্থিতিতে দুটি উত্তর একই রকম।


এই পদ্ধতির মধ্যে কিছু ভুল আছে? এটি দুর্দান্ত কাজ করে এবং দেখতে সুন্দর
লাগছে

লিঙ্কগুলির সাথে এটি কীভাবে ডিল করে এটি গৃহীত উত্তরের চেয়ে কিছুটা আলাদা। তারা অন্যথায় অভিন্ন।
অ্যান্টনি হ্যাচকিন্স

6

আপনি অন্যান্য ফোল্ডারগুলিতে যেতে চান এমন ক্ষেত্রে এটি কার্যকর হতে পারে। মাত্র 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)স্থানীয় ভেরিয়েবলের উপর নজর রাখার পরিবর্তে কেবল ব্যবহার করতে পারি ।
Zitrax

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')
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.