2013-07-01 3 views
6

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

बस स्पष्टता के लिए, मैं क्या चाहता हूं कि यह फ़ाइल मौजूद न हो तो फ़ाइल बनाई गई है। लेकिन अगर यह पहले से मौजूद है तो अपवाद फेंक दें। और यह सब परमाणु रूप से होना चाहिए।

उत्तर

6

पायथन 2.x में:

import os 

fd = os.open('filename', os.O_CREAT|os.O_EXCL) 
with os.fdopen(fd, 'w') as f: 
    .... 

अजगर 3.3+ में:

with open('filename', 'x') as f: 
    .... 
+0

यह कोड वांछित कार्यक्षमता प्राप्त करता है। – Adobri

+0

@naxa, पायथन 3.3+ का दस्तावेज़ीकरण ['खुला (..., 'x')'] (https://docs.python.org/3/library/functions.html#open) में कोई उपलब्धता नहीं है 'जानकारी; आमतौर पर इसका मतलब है कि यह सभी प्लेटफार्मों का समर्थन करता है। पाइथन 2.x ['os.fdopen'] के दस्तावेज़ों के दौरान (https://docs.python.org/2/library/os.html#os.fdopen) उपलब्धता के बारे में उल्लेख करते हैं: यूनिक्स, विंडोज़। – falsetru

+1

@naxa, [दस्तावेज़ीकरण: खुला() ध्वज स्थिरांक] के अनुसार [https://docs.python.org/2/library/os.html#open-flag-constants): निम्नलिखित स्थिरांक झंडे के लिए विकल्प हैं खुले() फ़ंक्शन पर पैरामीटर। उन्हें bitwise या ऑपरेटर का उपयोग करके जोड़ा जा सकता है। उनमें से कुछ सभी प्लेटफार्मों पर उपलब्ध नहीं हैं। उनकी उपलब्धता और उपयोग के विवरण के लिए, विंडोज़ पर यूनिक्स या एमएसडीएन पर खुले (2) मैनुअल पेज से परामर्श लें। – falsetru

4

आप एक यूनिक्स की तरह सिस्टम पर चला रहे हैं, इस तरह फ़ाइल को खोलने:

f = os.fdopen(os.open(filename, os.O_CREAT | os.O_WRONLY | os.O_EXCL), 'w') 

os.open को O_EXCL झंडा सुनिश्चित करता है कि फ़ाइल केवल बनाया जाएगा (और खोला) अगर यह नहीं करता है टी पहले से मौजूद है, अन्यथा OSError अपवाद उठाया जाएगा। अस्तित्व की जांच और निर्माण परमाणु रूप से प्रदर्शन किया जाएगा, इसलिए आपके पास फ़ाइल बनाने के लिए कई धागे या प्रक्रियाएं हो सकती हैं, और केवल एक ही सफल हो जाएगा।

+0

उन स्थिरांक के दोनों [साथ विंडोज पर उपलब्ध] होना चाहिए (http: //docs.python। org/2/पुस्तकालय/os.html # खुले झंडा स्थिरांक)। –

+1

स्थिरांक उपलब्ध हो सकते हैं, लेकिन मैं दावा नहीं करता कि परमाणुता को कुछ शोध किए बिना उसी तरह लागू किया जाता है। – user4815162342

+0

मुझे लगता है कि मैंने जो पूछा था, वह था कि यदि फ़ाइल मौजूद नहीं है, तो इसे खोलें, लेकिन यदि यह मौजूद है (पहले से ही किसी अन्य प्रक्रिया द्वारा बनाई गई है), तो अपवाद फेंक दें। ऐसा लगता है कि अगर फ़ाइल मौजूद नहीं है और यह मौजूद होगा तो यह कोड अपवाद फेंक देगा। – Adobri

संबंधित मुद्दे