অজগর: দুটি স্তরের ডিরেক্টরি পান


90

ঠিক আছে ... আমি জানি না মডিউলটি xকোথায়, তবে আমি জানি যে আমাকে দুটি স্তরের উপরে ডিরেক্টরিতে যাওয়ার প্রয়োজন need

সুতরাং, কাজ করার আরও একটি মার্জিত উপায় আছে:

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

পাইথন 2 এবং 3 উভয়ের জন্য সমাধান স্বাগত!


4
আমি মনে করি আপনার সমাধানটি পুরোপুরি ঠিক আছে। একটি pathlibসমাধান একটু আরো সুন্দর এবং আরো পাঠযোগ্য, কিন্তু পাইথন 2.7 সঙ্গে অন্তর্ভুক্ত করা হয় না। আমি যা পেয়েছি তার সাথে লাঠি বলতে চাই, সম্ভবত একটি মন্তব্য যুক্ত করুন।
jme

pip install pathlib2২.7-তে সংযম বজায় রাখার বিকল্পটি সম্ভবত মূল্যবান ।
জোনাথন

উত্তর:


108

আপনি ব্যবহার করতে পারেন pathlib। দুর্ভাগ্যক্রমে এটি পাইথন ৩.৪ এর জন্য শুধুমাত্র স্ট্যান্ডলিবে উপলব্ধ। আপনার যদি পুরানো সংস্করণ থাকে তবে আপনাকে পিপিআই থেকে একটি অনুলিপি এখানে ইনস্টল করতে হবে । এটি ব্যবহার করা সহজ হওয়া উচিত pip

from pathlib import Path

p = Path(__file__).parents[1]

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

এটি সেই parentsক্রমটি ব্যবহার করে যা পিতামাতার ডিরেক্টরিতে অ্যাক্সেস সরবরাহ করে এবং দ্বিতীয়বারের জন্য বেছে নেয়।

মনে রাখবেন যে pএই ক্ষেত্রে Pathতাদের নিজস্ব পদ্ধতি সহ কিছু অবজেক্টের ফর্ম হবে । আপনার যদি স্ট্রিং হিসাবে পাথের প্রয়োজন হয় তবে আপনি সেগুলিতে কল করতে পারেন str


একটি দুর্দান্ত উত্তর ধন্যবাদ এবং পাই 3 এর জন্য দুর্দান্ত। পিআই 2 এর জন্য এটি আমার প্রাথমিক প্রয়াসের চেয়ে ভাল আর সম্ভব নয় কারণ এটি তৈরি করে এবং অতিরিক্ত নির্ভরতা
জার্মাম

16
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত নয় কারণ Pathশ্রেণীর parentsকার্য সম্পাদনের জায়গার উপর নির্ভরশীল। আপনি যদি __file__এটির বর্তমান ডিরেক্টরিটি থেকে চালা করেন তবে Pathশ্রেণীর কোনও পিতা-মাতা থাকবে না। হয় @ Sebi2020 এর উত্তর গ্রহণ করা উচিত, বা আপনার মূল পদ্ধতিটি ব্যবহার করা উচিত। আমি বিশ্বাস করি যে আপনার আসল পদ্ধতিটি আরও পাঠযোগ্য।
লাল-সুর -৮৪

4
আপনার প্রয়োজন হতে পারেp = Path(os.path.abspath(__file__)).parents[1]
আদম রাউদোনিস

4
@ অ্যাডামাউডনিস এর পরিবর্তে os.path.abspath, আপনি এটিও ব্যবহার করতে পারেনPath(__file__).resolve().parents[1]
তুলিও ক্যাসাগ্রান্ডে

7
@ কাজানজ যেমন উল্লেখ করেছেন, অন্য পথ থেকে নির্বাহের সময় এই সমাধানটি কার্যকর হয় না। সবচেয়ে ভালো সমাধান হল: p = Path(__file__).resolve().parents[1]। আমি উত্তর হিসাবে এটি যোগ।
পাইথিংকার

48

খুব সহজ:

আপনি যা চান তা এখানে:

import os.path as path

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

10
এবং সম্ভবত os.pardirপরিবর্তে ব্যবহার ..
jme

sys.argv [0] পাইপথন.এক্সি দ্বারা পরিচালিত মডিউলটি ফেরত দেয় না? সুতরাং আমি প্রয়োজনীয় মডিউলটি যদি অন্য কোনও প্যাকেজ থেকে আমদানি করা হয় তবে এটি প্রয়োজনীয় কাজ করবে না আমি ঠিক এখানে?
jramm

আপনি যদি এটি কোনও মডিউলে ব্যবহার করতে চান তবে ব্যবহার করুন __file__
Sebi2020

4
@ জেমে আপনি কি এমন কোনও ওএস জানেন যা আপনি ".." এর চেয়ে আরও একটি স্ট্রিং সহ প্যারেন্ট ডিরেক্টরিটি পাবেন? ???
Sebi2020

4
@ Sebi2020 হ্যাঁ, উল্লেখযোগ্যভাবে পুরানো ম্যাক ওএস। এখানে একটি তালিকা রয়েছে: en.wikedia.org/wiki/Path_( কমপিউটিং)
জেমে

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

ব্যক্তিগতভাবে, আমি দেখতে পেয়েছি যে ওএস মডিউলটি নীচে বর্ণিত হিসাবে সহজ পদ্ধতি iest আপনি যদি কেবলমাত্র এক স্তর পর্যন্ত যাচ্ছেন, ('..' ..) দিয়ে ('../ ..') প্রতিস্থাপন করুন।

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

--Check:
    os.getcwd()

4
'/' হার্ডকোডের জন্য এটি কি গ্রহণযোগ্য? আমি OS.chdir (os.join ('..', '..')) পড়ার আশা করছিলাম
গ্রিনআসজেড

2

আমি খুঁজে পেয়েছি যে নিম্নলিখিতগুলি 2.7.x এ ভালভাবে কাজ করে

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

2

আপনি এটি সাধারণ সমাধান হিসাবে ব্যবহার করতে পারেন:

import os

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

@ জনসিলা: আরও সুনির্দিষ্ট হতে পারে, কেন এটি অজগর নয়? পাঠযোগ্যতার জন্য, এটি কী করে তার আরও বেশি মন্তব্য থাকতে পারে - হ্যাঁ - তবে শেষ পর্যন্ত এটি স্ট্যান্ডওভারফ্লো / সিকিউশনস
অ্যাক্সেল হাইডার

এটি সামান্য ঘন, তবে আমি মনে করি এটি খুব বিমূর্ত এবং পাঠযোগ্য নয়। এটি এখানে পোস্ট করা অন্য উত্তরগুলির একটি সাধারণ সংস্করণ। যদিও আমি কোনও ক্রিয়াকলাপ বাস্তবায়নের প্রয়োজন ছাড়াই কাজগুলি করার একটি স্ট্যান্ডার্ড লাইব্রেরি পদ্ধতি চাই।
রায়ানজডিলন

1

আরও ক্রস প্ল্যাটফর্মের বাস্তবায়ন হবে:

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

parentউইন্ডোজ ব্যবহার করা সমর্থিত নয়। এছাড়াও যোগ .resolve()করতে হবে:

পথে সমস্ত সিমলিংকগুলি সমাধান করে এবং এটি স্বাভাবিককরণেরও পথটিকে নিখুঁত করুন (উদাহরণস্বরূপ উইন্ডোজের অধীনে স্ল্যাশগুলি ব্যাকস্ল্যাশে পরিণত করা)


4
আপনার parentউইন্ডোজে কাজ না করার কোনও উত্স আছে ? আপনি এই মন্তব্যটি লেখার পরে এটি স্থির হয়ে গেছে বলে মনে হচ্ছে। উইন্ডোজ 10
নাথান

আমি parentউইন্ডোজ 10 এ অজগর 3.6.5 দিয়ে কাজ করতে পারি । অজগরটির কোন সংস্করণ আপনি @ ঝুকভোগিন সম্পর্কে বলছেন?
ggulgulia

@ggulgulia আমি বিশ্বাস করি এটি 3.7
zhukovgreen

1

ধরে নেওয়া হচ্ছে আপনি xy দুটি ফোল্ডার নামের অজগর ফাইলটি আপনার অজগর ফাইলটি অ্যাক্সেস করতে চান। এটি আমার এবং প্ল্যাটফর্মের জন্য স্বাধীন কাজ করে।

".././xyz"


0

(পথলিবি.পথ ('../../' '))। সমাধান করুন ()


কার্যকারী ডিরেক্টরি সম্পর্কিত মডিউল নয় বরং পাথ দেয়
jramm

-1

আমি এখনও ২.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সেই স্ক্রিপ্টের সাথে ফাইলটি "স্ক্রিপ্টস" নামে একটি ফোল্ডারে রেখেছি । এটি ম্যাকের ডকুমেন্টস দির এবং তারপরে ব্যবহারকারীর কাছে পৌঁছায়।

(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

এটি পিতামাতার দিরের উত্তরটির সুস্পষ্ট এক্সট্রোপোলেশন । কম লাইনে কম-ভাল সমাধানের চেয়ে সাধারণ সমাধান ব্যবহার করা ভাল।

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