পিতামাতার দির লোকেশন কীভাবে পাবেন


131

এই কোডটি b.py এ টেমপ্লেটগুলি / ব্লগ 1 / পেজ এইচটিএমএল পাবেন:

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

এবং কীভাবে পিতা-মাতার অবস্থান পাবেন

ধন্যবাদ

আপডেট হয়েছে:

এটা ঠিক:

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
হ্যাঁ, এটি টেমপ্লেটগুলি / ব্লগ 1 / পেজ এইচটিএমএল
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'))তারপরে আরও সহজ হবে
ফেলিক্স ক্লিং

1
@ জেজেএম: না, আপনি এই পৃষ্ঠাটি পান না । এটি এমন কোনও ব্ল্যাকবক্স নয় যা আপনি কেবল টেমপ্লেট ফাইলটি ব্যবহার করতে ব্যবহার করতে পারেন। এটি তুচ্ছ ছোট পদক্ষেপগুলির একটি সিরিজ সম্পাদন করে এবং আপনি যদি সেগুলি বুঝতে পারতেন তবে আপনার এই প্রশ্নটি হবে না।
সাইলেন্টগোস্ট

উত্তর:


173

আপনাকে উচ্চ আরোহণ বারবার dirname প্রয়োগ করতে পারবেন: dirname(dirname(file))। তবে এটি কেবলমাত্র রুট প্যাকেজ পর্যন্ত যেতে পারে। এই একটা সমস্যা হয়, তাহলে ব্যবহার os.path.abspath: dirname(dirname(abspath(file)))


37
আমি জানি ওপি সম্পর্কে জানেন dirname। এটি প্রত্যেকের কাছেই স্পষ্ট নয় যে কোনও ডিরেক্টরিতে ডাইরনাম প্রয়োগ করা পিতামাতার ডিরেক্টরিটি দেয়।
মার্সেলো ক্যান্টোস

4
dirnameসবসময় পিতামাতার ডিরেক্টরি ফেরত দেয় না ; twitter.com/#!/AtivetiveState/status/671049326788608
শ্রীধর রত্নকুমার

2
@ শ্রীধর: এটি আপনার দৃষ্টিভঙ্গির উপর নির্ভর করে; আমি /লিফ ডিরেক্টরি এন্ট্রি নিজেই উপস্থাপন না করে শেষের পথে বিবেচনা করি , তবে এর বিষয়বস্তু, যার কারণ যেমন, প্রাইসিং ডিরেক্টরি না mv xxx yyy/হলে ব্যর্থ yyyহয়। যাই হোক না কেন, আমরা যদি আপনার বক্তব্যটিকে প্রদত্ত হিসাবে গ্রহণ করি তবে তা আমার উত্তরের প্রসঙ্গে অপ্রাসঙ্গিক। আমরাও fileনা ফলে dirnameকখনও একটি মধ্যে সমাপ্ত হবে /
মার্সেলো ক্যান্টোস

1
গৌণ সংশোধন: dirnameফিরে আসতে পারে '/', যা স্পষ্টভাবে একটিতে শেষ হয় /। এটিই একমাত্র ব্যতিক্রম AF
মার্সেলো ক্যান্টোস

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
এটি দুর্দান্ত, তবে এটি দুর্দান্তও হবে যদি স্ট্যান্ডার্ড লাইব্রেরিটি এটি সম্পাদন করে এমন কোনও সুবিধার ফাংশন যোগ করে ... প্রতিবার আমার এই
মজাদার

4
চান os.path.abspath(os.path.join(__file__, "..", "..")আরো পোর্টেবল হবে?
ধীরে ধীরে

40

এর সাথে আপেক্ষিক পথ ব্যবহার করুনpathlibপাইথন 3.4+ তে মডিউলটির :

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() (যা "ফাইল.টেক্সট" এর মতো এক স্তরের আর্গুমেন্ট বা ".." এর মতো আপেক্ষিক পিতামাতার উপর যেমন প্রত্যাশা অনুযায়ী কাজ করে না)
  • ব্যবহার করে না 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'

বেশ নয়, এটি ওএস নির্ভর (উইন্ডোজে কাজ করবে না)। এছাড়াও এটি আপেক্ষিক পাথ ব্যবহার করার অনুমতি দেয় না।
কেগাডেক

এটি একটি ভয়াবহ সমাধান। সমস্ত ওএসের জন্য কাজ করবে না
ওয়েব.লাইনার

0

আমি চেষ্টা করেছিলাম:

import os
os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))), os.pardir))
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.