यदि पायथन में निर्देशिका मौजूद है तो कैसे खोजें


1135

में osअजगर में मॉड्यूल, वहाँ अगर एक निर्देशिका मौजूद है, जैसे कुछ खोजने के लिए एक तरीका है:

>>> os.direxists(os.path.join(os.getcwd()), 'new_folder')) # in pseudocode
True/False

8
चेतावनी का एक शब्द - उच्चतम मूल्यांकित उत्तर दौड़ की स्थिति के लिए अतिसंवेदनशील हो सकता है। आप os.statइसके बजाय प्रदर्शन करना चाह सकते हैं , यह देखने के लिए कि क्या निर्देशिका दोनों मौजूद है और उसी क्षण एक निर्देशिका है।
d33tah

1
@ d33tah आपके पास एक अच्छा बिंदु हो सकता है लेकिन मुझे os.statनिर्देशिका को किसी फ़ाइल से बताने के लिए उपयोग करने का कोई तरीका नहीं दिखता है । यह OSErrorतब बढ़ जाता है जब पथ अमान्य हो, चाहे वह फ़ाइल या निर्देशिका हो। साथ ही, जाँच के बाद कोई भी कोड दौड़ की स्थिति के लिए भी अतिसंवेदनशील होता है।
टॉम ज़ातो -

4
@ TomáZZato: जो इस निष्कर्ष पर जाता है कि यह केवल ऑपरेशन करने और त्रुटियों को संभालने के लिए सुरक्षित है।
d33tah

2
@ David542 मैंने "isdir" "मौजूद है" के लिए सटीक परीक्षण के साथ स्पष्टीकरण का मामला जोड़ा। मुझे लगता है कि अब आप कुछ भी सीखेंगे। लेकिन यह नए लोगों को रोशन कर सकता था।
जियोस्टोनमार्टन

जवाबों:


1727

आप देख रहे हैं os.path.isdir, या os.path.existsयदि आप परवाह नहीं करते हैं कि यह एक फ़ाइल या एक निर्देशिका है।

उदाहरण:

import os
print(os.path.isdir("/home/el"))
print(os.path.exists("/home/el/myfile.txt"))

4
@syedrakib जबकि कोष्ठक का उपयोग यह इंगित करने के लिए किया जा सकता है कि कोई ऑब्जेक्ट कॉल करने योग्य है, जो कि पायथन में उपयोगी नहीं है, क्योंकि कक्षाएं भी कॉल करने योग्य हैं। इसके अलावा, पायथन में फ़ंक्शंस प्रथम श्रेणी के मान हैं, और आप उन्हें बिना कोष्ठक संकेतन के उपयोग कर सकते हैं , जैसेexisting = filter(os.path.isdir(['/lib', '/usr/lib', '/usr/local/lib'])
phihag

10
आप अन्य कार्यों के लिए फ़ंक्शन पास कर सकते हैं, जैसे map, लेकिन सामान्य स्थिति में, आप कार्यों को तर्क और कोष्ठक के साथ कहते हैं। इसके अलावा, आपके उदाहरण में कुछ टाइपो है। शायद आप का मतलब है filter(os.path.isdir, ['/lib', '/usr/lib', '/usr/local/lib'])
हुग्डब्रोर्न

4
इसके अलावा, os.path.isfile(path)अगर आप केवल इस बात की परवाह करते हैं कि क्या यह एक फाइल है।
निकोलस

2
ध्यान रखें कि कुछ प्लेटफ़ॉर्म पर ये फ़ाइल / निर्देशिका मौजूद होने पर झूठे हो जाएंगे, लेकिन रीड अनुमति त्रुटि भी होती है।
काउलिनेटर

73

बहुत करीब! यदि आप वर्तमान में मौजूद एक निर्देशिका के नाम से गुजरते हैं तो os.path.isdirवापस लौटता Trueहै। यदि यह मौजूद नहीं है या यह एक निर्देशिका नहीं है, तो यह वापस आ जाता है False


70

पायथन 3.4 ने मानक पुस्तकालय में मॉड्यूल पेश कियाpathlib , जो फाइलसिस्टम रास्तों को संभालने के लिए एक वस्तु उन्मुख दृष्टिकोण प्रदान करता है। is_dir()और exists()एक के तरीकों Pathवस्तु सवाल का जवाब देने के लिए इस्तेमाल किया जा सकता है:

In [1]: from pathlib import Path

In [2]: p = Path('/usr')

In [3]: p.exists()
Out[3]: True

In [4]: p.is_dir()
Out[4]: True

पथ (और तार) /ऑपरेटर के साथ एक साथ जुड़ सकते हैं :

In [5]: q = p / 'bin' / 'vim'

In [6]: q
Out[6]: PosixPath('/usr/bin/vim') 

In [7]: q.exists()
Out[7]: True

In [8]: q.is_dir()
Out[8]: False

पाथिब पर भी पाथिब 2 मॉड्यूल के माध्यम से पायथन 2.7 पायथन पर उपलब्ध है


कुछ स्पष्टीकरण सहायक होगा। आप क्यों कर रहे हैं " p / 'bin' / 'vim'?
नाथन

1
@frank मैंने उत्तर के दूसरे भाग पर थोड़ा विस्तार किया।
जोएलोस्टब्लोम

34

हाँ, उपयोग करें os.path.exists()


23
यह जाँच नहीं करता है कि पथ एक निर्देशिका है।
कर्क स्ट्रूसर

7
अच्छा निर्णय। दूसरों ने कहा है कि os.path.isdirवह पूरा करेगा।
एगंडर्स 3

3
यदि आप समझते हैं कि यह प्रश्न का उत्तर नहीं देता है, तो आप उत्तर को क्यों नहीं हटाते?

3
@CamilStaps यह प्रश्न 354000 बार (अब तक) देखा गया था। यहां उत्तर केवल ओपी के लिए नहीं हैं, वे किसी के लिए भी हैं, जो किसी भी कारण से यहां आ सकते हैं। aganders3 का उत्तर प्रासंगिक है, भले ही यह ओपी की समस्या को सीधे हल न करता हो।
गेब्रियल

4
@ गैब्रिएल को जवाब में स्पष्ट किया जाना चाहिए कि यह वास्तव में क्या करता है।

21

हम कार्यों में निर्मित 2 के साथ देख सकते हैं

os.path.isdir("directory")

यह बूलियन को सही प्रदान करेगा निर्दिष्ट निर्देशिका उपलब्ध है।

os.path.exists("directoryorfile")

यदि निर्दिष्ट निर्देशिका या फ़ाइल उपलब्ध है तो यह बूलियड को सही देगा।

यह जाँचने के लिए कि क्या मार्ग निर्देशिका है;

os.path.isdir("directorypath")

अगर पथ निर्देशिका है तो बूलियन को सही देगा


2
यह पूरी तरह से पुराने, शीर्ष उत्तर के साथ बेमानी है।
डेविस हेरिंग


10

जैसे की:

In [3]: os.path.exists('/d/temp')
Out[3]: True

शायद os.path.isdir(...)सुनिश्चित करने के लिए टॉस करें।


10

बस os.statसंस्करण प्रदान करने के लिए (अजगर 2):

import os, stat, errno
def CheckIsDir(directory):
  try:
    return stat.S_ISDIR(os.stat(directory).st_mode)
  except OSError, e:
    if e.errno == errno.ENOENT:
      return False
    raise

7

ओएस आपको इन क्षमताओं का एक बहुत प्रदान करता है:

import os
os.path.isdir(dir_in) #True/False: check if this is a directory
os.listdir(dir_in)    #gets you a list of all files and directories under dir_in

यदि इनपुट पथ अमान्य है, तो listdir अपवाद छोड़ देगा।


5
#You can also check it get help for you

if not os.path.isdir('mydir'):
    print('new directry has been created')
    os.system('mkdir mydir')

6
अजगर ने निर्देशिका बनाने के लिए कार्यों का निर्माण किया है, इसलिए os.makedirs('mydir')इसके बजाय बेहतर उपयोग करेंos.system(...)
gizzmole

9
आप छाप रहे हैं कि 'नई निर्देशिका बनाई गई है' लेकिन आपको यह पता नहीं है। यदि आपके पास निर्देशिका बनाने की अनुमति नहीं है तो क्या होगा? आप प्रिंट करेंगे 'नई निर्देशिका बनाई गई है' लेकिन यह सच नहीं होगा। क्या ऐसा।
वोज्शिएक जकुबस

4

एक सुविधाजनक Unipathमॉड्यूल है।

>>> from unipath import Path 
>>>  
>>> Path('/var/log').exists()
True
>>> Path('/var/log').isdir()
True

अन्य संबंधित चीजें जिनकी आपको आवश्यकता हो सकती है:

>>> Path('/var/log/system.log').parent
Path('/var/log')
>>> Path('/var/log/system.log').ancestor(2)
Path('/var')
>>> Path('/var/log/system.log').listdir()
[Path('/var/foo'), Path('/var/bar')]
>>> (Path('/var/log') + '/system.log').isfile()
True

आप इसे पाइप का उपयोग करके स्थापित कर सकते हैं:

$ pip3 install unipath

यह बिल्ट-इन के समान है pathlib। अंतर यह है कि यह हर पथ को एक स्ट्रिंग के रूप में मानता है ( Pathएक उपवर्ग है str), इसलिए यदि कोई फ़ंक्शन एक स्ट्रिंग की अपेक्षा करता है, तो आप इसे आसानी से पास कर सकते हैंPath इसे स्ट्रिंग में बदलने की आवश्यकता के बिना ऑब्जेक्ट ।

उदाहरण के लिए, यह Django और के साथ बहुत अच्छा काम करता है settings.py:

# settings.py
BASE_DIR = Path(__file__).ancestor(2)
STATIC_ROOT = BASE_DIR + '/tmp/static'

4

यदि आप वहां नहीं हैं तो आप निर्देशिका बनाना चाहते हैं।

स्रोत , अगर यह अभी भी एसओ पर है।

================================================== ===================

पायथन, 3.5 पर, उपयोग करें pathlib.Path.mkdir:

from pathlib import Path
Path("/my/directory").mkdir(parents=True, exist_ok=True)

पायथन के पुराने संस्करणों के लिए, मुझे अच्छे गुणों के साथ दो उत्तर दिखाई देते हैं, प्रत्येक में एक छोटा दोष है, इसलिए मैं इस पर अपना ध्यान दूंगा:

कोशिश करो os.path.exists, और os.makedirsनिर्माण के लिए विचार करें ।

import os
if not os.path.exists(directory):
    os.makedirs(directory)

जैसा कि टिप्पणियों और अन्य जगहों पर उल्लेख किया गया है, एक दौड़ की स्थिति है - यदि निर्देशिका कॉल os.path.existsऔर os.makedirsकॉल के बीच बनाई गई है , तो os.makedirsएक के साथ विफल हो जाएगी OSError। दुर्भाग्य से, कंबल-कैचिंग OSErrorऔर जारी रखना मूर्खतापूर्ण नहीं है, क्योंकि यह अन्य कारकों, जैसे अपर्याप्त अनुमति, पूर्ण डिस्क, आदि के कारण निर्देशिका बनाने में विफलता को अनदेखा करेगा।

एक विकल्प यह होगा OSErrorकि एम्बेडेड त्रुटि कोड की जांच की जाए और ( पायथन के OSError से जानकारी प्राप्त करने का कोई क्रॉस-प्लेटफ़ॉर्म तरीका हो ):

import os, errno

try:
    os.makedirs(directory)
except OSError as e:
    if e.errno != errno.EEXIST:
        raise

वैकल्पिक रूप से, एक दूसरा हो सकता है os.path.exists , लेकिन मान लीजिए कि दूसरे ने पहले चेक के बाद निर्देशिका बनाई, फिर दूसरे से पहले इसे हटा दिया - हमें अभी भी बेवकूफ बनाया जा सकता है।

आवेदन के आधार पर, समवर्ती संचालन का खतरा फ़ाइल अनुमतियों जैसे अन्य कारकों द्वारा उत्पन्न खतरे से कम या अधिक हो सकता है। कार्यान्वयन को चुनने से पहले डेवलपर को विशेष रूप से विकसित किए जा रहे एप्लिकेशन और उसके अपेक्षित वातावरण के बारे में अधिक जानना होगा।

पायथन के आधुनिक संस्करण इस कोड में काफी सुधार करते हैं, दोनों FileExistsError(3.3 + में) उजागर करके ...

try:
    os.makedirs("path/to/directory")
except FileExistsError:
    # directory already exists
    pass

... और अनुमति देकर किसी कीवर्ड को किसी तर्क os.makedirsकहा जाता हैexist_ok (3.2+ में)।

os.makedirs("path/to/directory", exist_ok=True)  # succeeds even if directory exists.

0

दो चीज़ें

  1. जाँच करें कि क्या निर्देशिका मौजूद है?
  2. यदि नहीं, तो एक निर्देशिका (वैकल्पिक) बनाएँ।
import os
dirpath = "<dirpath>" # Replace the "<dirpath>" with actual directory path.

if os.path.exists(dirpath):
   print("Directory exist")
else: #this is optional if you want to create a directory if doesn't exist.
   os.mkdir(dirpath):
   print("Directory created")
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.