दिलचस्प पोस्ट
अपने उपभोक्ता में जनरेटर अपवाद को नियंत्रित करें 3.1 रेलवे का उपयोग करते हुए, आप अपना "पृष्ठ विशिष्ट" जावास्क्रिप्ट कोड कहां डालते हैं? जावास्क्रिप्ट ऑब्जेक्ट के लिए प्रोटोटाइप को जोड़ना डैपर। रैनबो वीएस डापर। कॉन्ट्रैब दो मानदंडों द्वारा एक पायथन सूची को छंटनी JavaScript का उपयोग करके ड्रॉपडाउन सूची में चयनित मान प्राप्त करें? एएसपी एमवीसी दृश्य के अंदर AJAX.beginform का उपयोग करके डिवेल को अपडेट करें Xcode: टेस्ट बनाम डेबग प्रीप्रोसेसर मैक्रोज़ मेरी कस्टम छवि के साथ फेसबुक लॉगइन बटन को कैसे बदला जाए जेएसएफ ने बीन नामकरण सम्मेलनों का प्रबंधन किया एंड्रॉइड में छवियों को साझा करने के लिए साझाकरण आशय का उपयोग करके "साझा छवि साझा करें" का उपयोग कैसे करें? "टाइमर" को लागू करने का सबसे अच्छा तरीका क्या है? । सी बनाम बनाम। सीसी बनाम .सीपीपी बनाम। एचपीपी बनाम। एच बनाम। सीएक्स सी में फाइल डिस्क्रिप्टर से फ़ाइल नाम प्राप्त करना सशर्त अभिव्यक्ति के साथ कोणीय एनजी-शैली

पायथन में mkdir -p कार्यक्षमता

पायथन से शेल पर mkdir -p समान कार्यक्षमता प्राप्त करने का एक तरीका है। मैं एक सिस्टम कॉल के अलावा एक समाधान की तलाश कर रहा हूं मुझे यकीन है कि कोड 20 लाइनों से कम है, और मैं सोच रहा हूं कि अगर कोई इसे पहले से ही लिखा है?

Solutions Collecting From Web of "पायथन में mkdir -p कार्यक्षमता"

mkdir -p कार्यक्षमता निम्नानुसार है:

 import errno import os def mkdir_p(path): try: os.makedirs(path) except OSError as exc: # Python >2.5 if exc.errno == errno.EEXIST and os.path.isdir(path): pass else: raise 

अद्यतन करें

पायथन ≥ 3.2 के लिए, os.makedirs पास एक वैकल्पिक तीसरा तर्क मौजूद exist_ok , जब सही होता है, exist_ok mkdir -p कार्यक्षमता को सक्षम करता है – जब तक कि mode प्रदान नहीं किया जाता है और मौजूदा डायरेक्टरी में इच्छित लोगों की तुलना में अलग अनुमतियां होती हैं; उस मामले में, OSError पहले से उठाया गया है

अपडेट 2

पायथन 3.5 के लिए, pathlib.Path.mkdir भी है:

 import pathlib pathlib.Path("/tmp/path/to/desired/directory").mkdir(parents=True, exist_ok=True) 

पायथन 3.5 में exist_ok पैरामीटर जोड़ा गया था।

पायथन> = 3.2 में, यह है

 os.makedirs(path, exist_ok=True) 

पहले के संस्करणों में, @ टीज़ॉट के उत्तर का उपयोग करें।

यह अपवाद फँसाने से आसान है:

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

अस्वीकरण इस दृष्टिकोण के लिए दो सिस्टम कॉल की आवश्यकता होती है जो कुछ वातावरणों / परिस्थितियों में दौड़ की स्थिति के लिए अधिक संवेदी होती है। यदि आप किसी नियंत्रित परिवेश में चलने वाली सरल फेंकने वाली स्क्रिप्ट की तुलना में कुछ अधिक परिष्कृत लिख रहे हैं, तो आप स्वीकृत उत्तर के साथ जा रहे हैं जिसके लिए केवल एक सिस्टम कॉल की आवश्यकता होती है।

अद्यतित 2012-07-27

मुझे इस उत्तर को हटाने की कोशिश हो रही है, लेकिन मुझे लगता है कि नीचे टिप्पणी थ्रेड में मूल्य है। जैसे, मैं इसे विकी में परिवर्तित कर रहा हूं।

हाल ही में, मैं इस distutils.dir_util.mkpath पाया:

 In [17]: from distutils.dir_util import mkpath In [18]: mkpath('./foo/bar') Out[18]: ['foo', 'foo/bar'] 

यदि फ़ाइल पहले से मौजूद है, तो mkdir -p आपको एक त्रुटि देता है:

 $ touch /tmp/foo $ mkdir -p /tmp/foo mkdir: cannot create directory `/tmp/foo': File exists 

तो पिछले सुझावों में सुधार के लिए अपवाद raise होगा यदि os.path.isdir False ( errno.EEXIST लिए जाँच करते errno.EEXISTerrno.EEXIST )।

(अपडेट) इस अत्यधिक समान प्रश्न को भी देखें; मैं स्वीकृत उत्तर (और चेतावनियों) से सहमत हूं, सिवाय मैं os.path.exists . os.path.isdir बजाय os.path.isdir की सिफारिश करेगा।

(अपडेट) टिप्पणी में एक सुझाव के अनुसार, पूरा फ़ंक्शन ऐसा दिखेगा:

 import os def mkdirp(directory): if not os.path.isdir(directory): os.makedirs(directory) 

जैसा कि अन्य समाधानों में उल्लिखित है, हम एक बार फाइल सिस्टम को हिट करने में सक्षम होना चाहते हैं, जबकि mkdir -p के व्यवहार की नकल करते समय मुझे नहीं लगता कि ऐसा करना संभव है, लेकिन हमें यथासंभव करीब होना चाहिए।

कोड पहले, स्पष्टीकरण बाद में:

 import os import errno def mkdir_p(path): """ 'mkdir -p' in Python """ try: os.makedirs(path) except OSError as exc: # Python >2.5 if exc.errno == errno.EEXIST and os.path.isdir(path): pass else: raise 

@ टाज़ॉट के उत्तर के लिए टिप्पणियों के मुताबिक संकेत मिलता है कि क्या आप वास्तव में इसे बनाने से पहले एक डायरेक्टरी बना सकते हैं या नहीं यह जांचने में समस्या है: आप यह नहीं बता सकते हैं कि इस बीच में किसी ने फाइल सिस्टम को बदल दिया है या नहीं। वह भी माफी मांगने की अजगर की शैली के साथ फिट बैठती है, अनुमति नहीं है।

इसलिए हमें जो पहली चीज करना चाहिए वह निर्देशिका बनाने की कोशिश करती है, फिर यदि यह गलत हो जाता है, तो यह काम क्यों किया जाता है

जैसा कि जैकब गैब्रिएलसन बताते हैं, एक ऐसा मामला है जिसे हमें देखना चाहिए, वह एक ऐसा मामला है जहां एक फाइल पहले से मौजूद है जहां हम निर्देशिका को डालने की कोशिश कर रहे हैं।

mkdir -p साथ:

 $ touch /tmp/foo $ mkdir -p /tmp/foo mkdir: cannot create directory '/tmp/foo': File exists 

पायथन में समान व्यवहार एक अपवाद उठाना होगा।

तो हमें यह पता लगाना होगा कि क्या यह मामला था। दुर्भाग्य से, हम नहीं कर सकते हमें एक ही त्रुटि संदेश वापस निर्माताओं से मिलता है कि क्या निर्देशिका मौजूद है (अच्छा) या एक फ़ाइल निर्देशिका (बुरा) के निर्माण को रोकने में मौजूद है।

क्या हुआ यह जानने का एकमात्र तरीका है कि फाइल सिस्टम का फिर से निरीक्षण करें कि क्या वहां एक निर्देशिका है। यदि है, तो चुपचाप वापस आओ, अन्यथा अपवाद बढ़ाएं

एकमात्र समस्या यह है कि फाइल सिस्टम एक अलग स्थिति में हो सकता है, जब वर्तमान में makedirs कहा गया था। उदा: एक फाइल अस्तित्व में थी जिसके कारण makedirs विफल हो गए, लेकिन अब एक निर्देशिका इसकी जगह है। यह वाकई बहुत मायने नहीं रखता है, क्योंकि फ़ंक्शन केवल एक अपवाद उठाए बिना चुपचाप से बाहर निकलता है, जब अंतिम फाइल सिस्टम के समय डायरेक्टरी अस्तित्व में आते हैं।

मुझे लगता है कि आसा का जवाब अनिवार्य रूप से सही है, लेकिन आप इसे थोड़ा अधिक mkdir -p तरह कार्य कर सकते हैं, या तो:

 import os def mkdir_path(path): if not os.access(path, os.F_OK): os.mkdirs(path) 

या

 import os import errno def mkdir_path(path): try: os.mkdirs(path) except os.error, e: if e.errno != errno.EEXIST: raise 

ये दोनों उस मामले को संभालते हैं जहां पथ पहले से ही चुपचाप रखता है लेकिन अन्य त्रुटियों को बुलबुला दें।

पायथॉन 3 मानक पुस्तकालय से पथलिब के साथ:

 Path(mypath).mkdir(parents=True, exist_ok=True) 

यदि माता-पिता सही हैं, तो इस मार्ग के किसी भी लापता अभिभावक को आवश्यकतानुसार तैयार किया जाता है; वे मोड को बिना खाते में लेते हुए डिफ़ॉल्ट अनुमतियों के साथ बनाए जाते हैं (POSIX mkdir -p कमांड की नकल करते हुए) यदि exist_ok गलत है (डिफ़ॉल्ट), एक FileExistsError उठाया जाता है यदि लक्ष्य निर्देशिका पहले से मौजूद है

यदि exist_ok true है, तो FileExistsError अपवादों को ध्यान नहीं दिया जाएगा (POSIX mkdir -p कमांड के समान व्यवहार), लेकिन केवल अगर अंतिम पथ घटक मौजूदा गैर-निर्देशिका फ़ाइल नहीं है।

संस्करण 3.5 में बदल दिया गया: मौजूद_एक पैरामीटर जोड़ा गया था।

कार्य घोषणा;

 import os def mkdir_p(filename): try: folder=os.path.dirname(filename) if not os.path.exists(folder): os.makedirs(folder) return True except: return False 

उपयोग:

 filename = "./download/80c16ee665c8/upload/backup/mysql/2014-12-22/adclient_sql_2014-12-22-13-38.sql.gz" if (mkdir_p(filename): print "Created dir :%s" % (os.path.dirname(filename)) 
 import os import tempfile path = tempfile.mktemp(dir=path) os.makedirs(path) os.rmdir(path) 

मुझे व्यक्तिगत रूप से निम्नलिखित के साथ सफलता मिली है, लेकिन मेरे फ़ंक्शन को शायद कुछ कहा जाना चाहिए जैसे 'यह निर्देशिका मौजूद है':

 def mkdirRecursive(dirpath): import os if os.path.isdir(dirpath): return h,t = os.path.split(dirpath) # head/tail if not os.path.isdir(h): mkdirRecursive(h) os.mkdir(join(h,t)) # end mkdirRecursive 
 import os from os.path import join as join_paths def mk_dir_recursive(dir_path): if os.path.isdir(dir_path): return h, t = os.path.split(dir_path) # head/tail if not os.path.isdir(h): mk_dir_recursive(h) new_path = join_paths(h, t) if not os.path.isdir(new_path): os.mkdir(new_path) 

@ डेव सी के जवाब पर आधारित लेकिन एक बग के साथ तय हुआ जहां पेड़ का हिस्सा पहले से मौजूद है