পাইথনে আমি কীভাবে প্যারেন্ট ডিরেক্টরিটি পেতে পারি?


350

ক্রস প্ল্যাটফর্মের উপায়ে পাইথনের কোনও পথের পিতামাতার ডিরেক্টরি কীভাবে পাবেন তা কেউ আমাকে বলতে পারেন। যেমন

C:\Program Files ---> C:\

এবং

C:\ ---> C:\

যদি ডিরেক্টরিটির কোনও প্যারেন্ট ডিরেক্টরি না থাকে তবে এটি ডিরেক্টরিটি নিজেই ফিরিয়ে দেয়। প্রশ্নটি সহজ মনে হতে পারে তবে আমি গুগলের মাধ্যমে এটি খনন করতে পারিনি।

উত্তর:


480

পাইথন থেকে আপডেট 3.4

pathlibমডিউলটি ব্যবহার করুন ।

from pathlib import Path
path = Path("/here/your/path/file.txt")
print(path.parent)

পুরানো উত্তর

এটা চেষ্টা কর:

import os.path
print os.path.abspath(os.path.join(yourpath, os.pardir))

yourpathপিতা-মাতার জন্য আপনি যে পথটি চান তা কোথায় ?


136
আপনার উত্তর সঠিক তবে সংশ্লেষিত; os.path.dirnameএর জন্য ফাংশনটি এর a+=5-4চেয়েও বেশি সংশ্লেষিত হয় a+=1। প্রশ্নটি কেবলমাত্র মূল ডিরেক্টরিকেই অনুরোধ করেছে, এটি বিদ্যমান নয় বা প্রতীকী লিঙ্কগুলি ধরে নিয়ে আসল সত্য পিতামহ নির্দেশিকা নয়।
tzot

15
এটা os.pardir, না os.path.pardir
বুলেটিলিবলু

9
@ বাউটিলেবলু: উভয়ই os.pardirএবং os.path.pardirসত্যই সঠিক (তারা অভিন্ন)।
এরিক হে লেবিগোট

45
@ টজোট: দুর্ভাগ্যক্রমে কোনও অনুসরণীয় os.path.dirnameস্ল্যাশ পাথের অন্তর্ভুক্ত কিনা তার উপর নির্ভর করে বিভিন্ন ফলাফল দেয়। আপনি যদি নির্ভরযোগ্য ফলাফল চান তবে আপনাকে os.path.joinউপরের উত্তরে পদ্ধতিটি ব্যবহার করতে হবে ।
আর্টফুঙ্কেল

21
যেহেতু এটি একটি স্ট্যাকওভারফ্লো প্রশ্নটি ওয়ারেন্ট করার পক্ষে আপাতদৃষ্টিতে জটিল, তাই আমি মনে করি এটি একটি বিল্ট-ইন ফাংশন হিসাবে os.path লাইব্রেরিতে যুক্ত করা উচিত।
প্রেরণ করা হয়েছে

324

ব্যবহার os.path.dirname:

>>> os.path.dirname(r'C:\Program Files')
'C:\\'
>>> os.path.dirname('C:\\')
'C:\\'
>>>

ক্যাভেট: os.path.dirname()কোনও ট্রিলিং স্ল্যাশ পাথে অন্তর্ভুক্ত করা হয়েছে তার উপর নির্ভর করে বিভিন্ন ফলাফল দেয়। এটি আপনি চাইলে শব্দার্থক বা নাও থাকতে পারে। Cf. @ কেন্ডারের উত্তর ব্যবহার করে os.path.join(yourpath, os.pardir)


6
os.path.dirname(r'C:\Program Files')কি? পাইথন আপনাকে কেবল সেই ডিরেক্টরিটি দেবে যেখানে ফাইল 'প্রোগ্রাম ফাইল' থাকবে। : আরো কি, এটা এমনকি অস্তিত্ব, নেই দেখ os.path.dirname(r'c:\i\like\to\eat\pie')আউটপুট'c:\\i\\like\\to\\eat'
নিক টি

41
মূল পোস্টারটি নির্দেশ করে না যে ডিরেক্টরি থাকতে হবে। অনেকগুলি প্যাথনাম পদ্ধতি রয়েছে যা স্ট্রিং ম্যানিপুলেশন ছাড়া কিছুই করে না। পাথের নামটি আসলে রয়েছে কিনা তা যাচাই করতে ডিস্ক অ্যাক্সেসের প্রয়োজন। এটি আবেদনের উপর নির্ভর করে বা এটি পছন্দসই হতে পারে।
ওয়াই ইপ তুং

10
এই সমাধানটি os.sep পিছনে পিছনে সংবেদনশীল। Os.sep == '/' বলুন। dirname (foo / bar) -> foo, তবে dirname (foo / bar /) -> foo / bar
মার্সিন

6
এটা নকশা দ্বারা। এটি একটি অনুসরণ / সহ পথের ব্যাখ্যায় নেমে আসে। আপনি কি "পাথ 1" "পথ 1 /" এর সমান মনে করেন? গ্রন্থাগারটি সর্বাধিক সাধারণ ব্যাখ্যা ব্যবহার করে যে তারা পৃথক। কিছু প্রসঙ্গে লোকেরা তাদের সমতুল্য হিসাবে বিবেচনা করতে পারে। এই ক্ষেত্রে আপনি প্রথমে একটি স্ট্রাইপ ('/') করতে পারেন। গ্রন্থাগারটি অন্য ব্যাখ্যাটি বেছে নিলে আপনি বিশ্বস্ততা হারাবেন।
ওয়াই ইপ টুং

3
@ রায়ান, আমি সে সম্পর্কে জানি না। ইউআরআইতে আপেক্ষিক পথের সমস্যা এবং একটি অনুপস্থিতির উপস্থিতি এবং অনুপস্থিতির সমস্ত সূক্ষ্মতার বিষয়টি বিবেচনা করার জন্য একটি সম্পূর্ণ আরএফসি 1808 লেখা আছে। আপনি যদি এমন কোনও ডকুমেন্টেশন জানেন যা তাদের বলে সাধারণভাবে সমতুল্য আচরণ করা উচিত তবে দয়া করে এটি উল্লেখ করুন।
ওয়াই ইপ টুং

112

পাথলিব পদ্ধতি (পাইথন ৩.৪++)

from pathlib import Path
Path('C:\Program Files').parent
# Returns a Pathlib object

সনাতন পদ্ধতি

import os.path
os.path.dirname('C:\Program Files')
# Returns a string


আমার কোন পদ্ধতিটি ব্যবহার করা উচিত?

প্রচলিত পদ্ধতিটি ব্যবহার করুন যদি:

  • আপনি যদি বিদ্যমান কোড তৈরির ত্রুটিগুলি সম্পর্কে চিন্তিত হন যদি এটি কোনও প্যাথলিব অবজেক্ট ব্যবহার করে। (যেহেতু পাথলিব বস্তুগুলি স্ট্রিং দিয়ে সংমিশ্রণ করা যায় না))

  • আপনার পাইথন সংস্করণ 3.4 এরও কম।

  • আপনার একটি স্ট্রিং দরকার এবং আপনি একটি স্ট্রিং পেয়েছিলেন। উদাহরণস্বরূপ বলুন যে আপনার কাছে একটি ফাইলপথ উপস্থাপনের স্ট্রিং রয়েছে এবং আপনি প্যারেন্ট ডিরেক্টরিটি পেতে চান যাতে আপনি এটি JSON স্ট্রিংয়ে রাখতে পারেন। এটি কোনও পাথলিব অবজেক্টে রূপান্তরিত করা এবং তার জন্য আবার ফিরে আসার মতো নির্বোধ হবে।

যদি উপরের কোনওটি প্রয়োগ না করে তবে পাথলিব ব্যবহার করুন।



পাথলিব কী?

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

ডিরেক্টরি গাছের অভ্যন্তরে নেভিগেট করা:

>>> p = Path('/etc')
>>> q = p / 'init.d' / 'reboot'
>>> q
PosixPath('/etc/init.d/reboot')
>>> q.resolve()
PosixPath('/etc/rc.d/init.d/halt')

অনুসন্ধানের পথের বৈশিষ্ট্য:

>>> q.exists()
True
>>> q.is_dir()
False

4
এটিই একমাত্র বুদ্ধিমান উত্তর। আপনি যদি পাইথন 2 ব্যবহার করতে বাধ্য হন তবে কেবল pip install pathlib2এবং ব্যাকপোর্টটি ব্যবহার করুন।
নবীন

1
এই সমাধানটি পিছনে পিছনে সংবেদনশীল নয় os.sep!
ডিলান এফ

35
import os
p = os.path.abspath('..')

C:\Program Files ---> C:\\\

C:\ ---> C:\\\


7
এটি কেবল সিডাব্লুডির পিতামাতাকে পেয়ে যায়, ওপি যেমনটি বলেছিল তেমন কোনও পাথের পিতামাতার নয়।
সার্জিও

আপনার ইউআরএল শেষে ডাবল বিন্দু যুক্ত করুন এবং এটি কাজ করবে উদাহরণস্বরূপ os.path.abspath(r'E:\O3M_Tests_Embedded\branches\sw_test_level_gp\test_scripts\..\..') ফলাফল:E:\\O3M_Tests_Embedded\\branches
অরিন্দম রায়চৌধুরী

এর মানে হল এই: /
loretoparisi

26

@ কেেন্ডারের একটি বিকল্প সমাধান

import os
os.path.dirname(os.path.normpath(yourpath))

yourpathপিতা-মাতার জন্য আপনি যে পথটি চান তা কোথায় ?

তবে এই সমাধানটি নিখুঁত নয়, যেহেতু এটি yourpathখালি স্ট্রিং বা বিন্দুর ক্ষেত্রে হ্যান্ডেল করবে না ।

এই অন্যান্য সমাধানটি কর্নারের ক্ষেত্রে আরও সুন্দরভাবে পরিচালনা করবে:

import os
os.path.normpath(os.path.join(yourpath, os.pardir))

এখানে পাওয়া প্রতিটি মামলার ফলাফল (ইনপুট পাথ আপেক্ষিক):

os.path.dirname(os.path.normpath('a/b/'))          => 'a'
os.path.normpath(os.path.join('a/b/', os.pardir))  => 'a'

os.path.dirname(os.path.normpath('a/b'))           => 'a'
os.path.normpath(os.path.join('a/b', os.pardir))   => 'a'

os.path.dirname(os.path.normpath('a/'))            => ''
os.path.normpath(os.path.join('a/', os.pardir))    => '.'

os.path.dirname(os.path.normpath('a'))             => ''
os.path.normpath(os.path.join('a', os.pardir))     => '.'

os.path.dirname(os.path.normpath('.'))             => ''
os.path.normpath(os.path.join('.', os.pardir))     => '..'

os.path.dirname(os.path.normpath(''))              => ''
os.path.normpath(os.path.join('', os.pardir))      => '..'

os.path.dirname(os.path.normpath('..'))            => ''
os.path.normpath(os.path.join('..', os.pardir))    => '../..'

ইনপুট পাথ পরম (লিনাক্স পাথ):

os.path.dirname(os.path.normpath('/a/b'))          => '/a'
os.path.normpath(os.path.join('/a/b', os.pardir))  => '/a'

os.path.dirname(os.path.normpath('/a'))            => '/'
os.path.normpath(os.path.join('/a', os.pardir))    => '/'

os.path.dirname(os.path.normpath('/'))             => '/'
os.path.normpath(os.path.join('/', os.pardir))     => '/'

পথটি সর্বদা স্বাভাবিক করা একটি বিশেষ অনুশীলন, বিশেষত ক্রস প্ল্যাটফর্মের কাজ করার সময়।
দেবপ্লেয়ার

এটা সঠিক উত্তর! এটি আপেক্ষিক পথ আপেক্ষিক রাখে। ধন্যবাদ!
ম্যাক্সিম

@ ম্যাক্সিম এই সমাধানটি নিখুঁত ছিল না, কারণ আমি এটির উন্নতি করেছি যেহেতু মূল সমাধানটি একটি ক্ষেত্রে পরিচালনা করে না
বেনজারোবিন ২

@ বেঞ্জারোবিন হ্যাঁ, আমি কর্নারের ক্ষেত্রে ভাবিনি। ধন্যবাদ।
ম্যাক্সিম

18
os.path.split(os.path.abspath(mydir))[0]

এটি কোনও ডিরেক্টরিতে পাথের জন্য কাজ করবে না, এটি কেবল ডিরেক্টরিটি আবার ফিরিয়ে দেবে।
অ্যান্টনি ব্রিগস

2
@ অ্যান্টনিব্রিগস, আমি উবুন্টু ১২.০৪-তে পাইথন ২.7.৩ ব্যবহার করে এটি চেষ্টা করেছিলাম এবং মনে হচ্ছে এটি ঠিক আছে। প্রত্যাশিত হিসাবে os.path.split(os.path.abspath("this/is/a/dir/"))[0]প্রত্যাবর্তন '/home/daniel/this/is/a'আমার চেক করার জন্য এই মুহুর্তে চলমান উইন্ডোজ বাক্স নেই। আপনি যে আচরণটি রিপোর্ট করেছেন সেটিকে আপনি কী সেটআপে দেখেছেন?
ড্যান মেনেস

আপনি করতে পারেন parentdir = os.path.split(os.path.apspath(dir[:-1]))[0]। এটি - আমি নিশ্চিত - কাজ করে কারণ যদি শেষের দিকে স্ল্যাশ থাকে তবে তা মুছে ফেলা হয়; যদি কোনও স্ল্যাশ না থাকে তবে পূর্ববর্তী পূর্ববর্তী স্ল্যাশের কারণে এটি এখনও কাজ করবে (পথের শেষ অংশটি কেবল একটি চরের দীর্ঘ হলেও)। অবশ্যই এটি অনুমান করে যে পথটি সঠিক এবং এমন কিছু বলবে না /a//b/c///d////(ইউনিক্সে এটি এখনও বৈধ), যা বেশিরভাগ ক্ষেত্রে তারা (যথাযথ) বিশেষত যখন আপনি কিছু os.path.abspathবা অন্য কোনও os.pathকাজ করেন।
dylnmc

এছাড়াও, শেষে প্রচুর স্ল্যাশগুলির মোকাবিলা করার জন্য, আপনি কেবল লুপের জন্য একটি ছোট লিখতে পারেন যা সেগুলি সরিয়ে দেয়। আমি নিশ্চিত যে এটি করার জন্য এমনকি কোনও চতুর ওয়ান-লাইনার থাকতে পারে, বা এটি করতে পারেন এবং একটি লাইনে os.path.split।
dylnmc

@ ডেন মেনেস আমি কেবল আপনাকে মন্তব্য করতে দেখেছি। আপনার মতো কিছু থাকলে os.path.split("a/b//c/d///")এবং উদাহরণস্বরূপ, cd //////dev////// is equivalent to সিডি / দেব / `বা cd /dev; যদি এটি কাজ করে না ; এই সব লিনাক্সে বৈধ। আমি শুধু এই নিয়ে এসেছেন এবং এটি দরকারী, যদিও হতে পারে: os.path.split(path[:tuple(ind for ind, char in enumerate(path) if char != "/" and char != "\\")[-1]])[0]। (এটি মূলত সর্বশেষ নন-স্ল্যাশ অনুসন্ধান করে এবং সেই চরটি পর্যন্ত পথের সাবস্ট্রিংটি পেয়ে যায়)) আমি ব্যবহার করেছি path = "/a//b///c///d////"এবং তারপরে পূর্বোক্ত বিবৃতিটি চালিয়েছি এবং পেয়েছি '/a//b///c'
dylnmc

14
os.path.abspath(os.path.join(somepath, '..'))

পালন:

import posixpath
import ntpath

print ntpath.abspath(ntpath.join('C:\\', '..'))
print ntpath.abspath(ntpath.join('C:\\foo', '..'))
print posixpath.abspath(posixpath.join('/', '..'))
print posixpath.abspath(posixpath.join('/home', '..'))

7
import os
print"------------------------------------------------------------"
SITE_ROOT = os.path.dirname(os.path.realpath(__file__))
print("example 1: "+SITE_ROOT)
PARENT_ROOT=os.path.abspath(os.path.join(SITE_ROOT, os.pardir))
print("example 2: "+PARENT_ROOT)
GRANDPAPA_ROOT=os.path.abspath(os.path.join(PARENT_ROOT, os.pardir))
print("example 3: "+GRANDPAPA_ROOT)
print "------------------------------------------------------------"

6

আপনি যদি চান শুধুমাত্র নাম একটি আর্গুমেন্ট এবং হিসাবে প্রদান করা ফাইলের অবিলম্বে পিতা বা মাতা যে ফোল্ডার না পথটি যে ফাইল করুন:

os.path.split(os.path.dirname(currentDir))[1]

যেমন একটি currentDirমান সঙ্গে/home/user/path/to/myfile/file.ext

উপরের কমান্ডটি ফিরে আসবে:

myfile


3
os.path.basename (os.path.dirname (কারেন্ট_ডির)) এখানেও কাজ করে।
দেবপ্লেয়ার

4
>>> import os
>>> os.path.basename(os.path.dirname(<your_path>))

উদাহরণস্বরূপ উবুন্টু:

>>> my_path = '/home/user/documents'
>>> os.path.basename(os.path.dirname(my_path))
# Output: 'user'

উদাহরণস্বরূপ উইন্ডোজ:

>>> my_path = 'C:\WINDOWS\system32'
>>> os.path.basename(os.path.dirname(my_path))
# Output: 'WINDOWS'

উভয় উদাহরণ পাইথন ২.7 এ চেষ্টা করেছিল


3
import os.path

os.path.abspath(os.pardir)

এটি অনুমান করে যে আপনি "বর্তমান ওয়ার্কিং ডিরেক্টরি" এর পিতামাতার ডিরেক্টরিটি চান এবং প্যারেন্ট ডিরেক্টরিটি সাধারণভাবে কোনও পথ নয়।
DevPlayer

3

মনে করুন আমাদের মতো ডিরেক্টরি কাঠামো আছে

1]

/home/User/P/Q/R

আমরা ডিরেক্টরি আর থেকে "পি" এর পথ অ্যাক্সেস করতে চাই এবং তারপরে আমরা ব্যবহার করে অ্যাক্সেস করতে পারি

ROOT = os.path.abspath(os.path.join("..", os.pardir));

2]

/home/User/P/Q/R

আমরা ডিরেক্টরি আর থেকে ডিরেক্টরি "Q" ডিরেক্টরিটি অ্যাক্সেস করতে চাই এবং তারপরে আমরা ব্যবহার করে অ্যাক্সেস করতে পারি

ROOT = os.path.abspath(os.path.join(".", os.pardir));

2

কেবল তুংয়ের উত্তরে কিছু যুক্ত করা (আপনি rstrip('/')যদি ইউনিক্স বাক্সে থাকেন তবে আপনাকে আরও নিরাপদ দিক হতে হবে)।

>>> input = "../data/replies/"
>>> os.path.dirname(input.rstrip('/'))
'../data'
>>> input = "../data/replies"
>>> os.path.dirname(input.rstrip('/'))
'../data'

তবে, যদি আপনি ব্যবহার না করেন তবে rstrip('/')প্রদত্ত আপনার ইনপুটটি

>>> input = "../data/replies/"

আউটপুট হবে,

>>> os.path.dirname(input)
'../data/replies'

যা আপনি উভয়ই চান "../data/replies/"এবং "../data/replies"একইরকম আচরণ করতে চান এমনটি সম্ভবত নয় ।


1
আমি "ইনপুট" পরিবর্তনশীল / রেফারেন্স হিসাবে ব্যবহার না করার পরামর্শ দেব। এটি একটি অন্তর্নির্মিত ফাংশন।
দেবপ্লেয়ার


1
print os.path.abspath(os.path.join(os.getcwd(), os.path.pardir))

আপনি আপনার পাই ফাইলের বর্তমান অবস্থানের প্যারেন্ট ডিরেক্টরিটি পেতে এটি ব্যবহার করতে পারেন।


2
এই পরামর্শটি প্রায়শই বাগগুলি বাড়ে। os.getcwd () প্রায়শই সেখানে থাকে না যেখানে "আপনার পাই ফাইল" থাকে। প্যাকেজ চিন্তা করুন। যদি আমি "কিছু_প্যাকেজ_বিহীন_সুবপ্যাকেজ" আমদানি করি তবে অনেকগুলি মডিউল সেই প্যাকেজের শীর্ষ-ডিরেক্টরিতে থাকবে না। os.getcwd () ফিরে আসে যেখানে আপনি সর্বাধিক-স্ক্রিপ্ট কার্যকর করেন exec এবং এটিও ধরে নিয়েছে যে আপনি এটি একটি কমান্ড লাইন থেকে করছেন।
DevPlayer

0

মূল ডিরেক্টরি পথ পান এবং নতুন ডিরেক্টরি (নাম new_dir) তৈরি করুন

অভিভাবক ডিরেক্টরি পাথ পান

os.path.abspath('..')
os.pardir

উদাহরণ 1

import os
print os.makedirs(os.path.join(os.path.dirname(__file__), os.pardir, 'new_dir'))

উদাহরণ 2

import os
print os.makedirs(os.path.join(os.path.dirname(__file__), os.path.abspath('..'), 'new_dir'))


0
import os

def parent_filedir(n):
    return parent_filedir_iter(n, os.path.dirname(__file__))

def parent_filedir_iter(n, path):
    n = int(n)
    if n <= 1:
        return path
    return parent_filedir_iter(n - 1, os.path.dirname(path))

test_dir = os.path.abspath(parent_filedir(2))

0

উপরে বর্ণিত উত্তরগুলি এক বা দুটি ডিরেক্টরি স্তরের উপরে উঠার জন্য পুরোপুরি ঠিক আছে, তবে যদি কোনও ডিরেক্টরিতে অনেক স্তরের (যেমন, 5 বা 10) ডিরেক্টরিতে যেতে হয় তবে তারা কিছুটা জটিল হয়ে উঠতে পারে। এই একটি তালিকা যোগদান করে সংক্ষেপে কাজ করা যেতে পারে N os.pardirযে গুলি os.path.join। উদাহরণ:

import os
# Create list of ".." times 5
upup = [os.pardir]*5
# Extract list as arguments of join()
go_upup = os.path.join(*upup)
# Get abspath for current file
up_dir = os.path.abspath(os.path.join(__file__, go_upup))
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.