एक मुद्दा यह है कि आपके उपरोक्त कोड में दौड़ की स्थिति है, क्योंकि अस्तित्व के परीक्षण के बीच एक अंतर है, और फ़ाइल बना रहा है। इसके लिए सुरक्षा प्रभाव हो सकते हैं (किसी को किसी संवेदनशील फ़ाइल में एक सिल्लिंक को दुर्भावनापूर्ण रूप से डालने के बारे में सोचें, जिसे वे ओवरराइट करने में सक्षम नहीं होंगे, लेकिन आपका प्रोग्राम उच्च विशेषाधिकार के साथ चल रहा है) इस तरह के हमले क्यों हैं os.tempnam () बहिष्कृत हैं।
इसके आस-पास पहुंचने के लिए, सबसे अच्छा तरीका यह है कि वास्तव में फ़ाइल को इस तरह से बनाने का प्रयास करें कि अगर यह विफल हो जाए तो आपको अपवाद मिलेगा, और सफलता पर, वास्तव में खुली फ़ाइल ऑब्जेक्ट को वापस कर दें। Os.O_CREAT और os.O_EXCL फ़्लैग दोनों को पार करके, निम्न स्तर os.open फ़ंक्शंस के साथ किया जा सकता है। एक बार खोले जाने के बाद, आपके द्वारा बनाई गई वास्तविक फ़ाइल (और वैकल्पिक रूप से फ़ाइल नाम) वापस करें।
def unique_file(file_name):
counter = 1
file_name_parts = os.path.splitext(file_name) # returns ('/path/file', '.ext')
while 1:
try:
fd = os.open(file_name, os.O_CREAT | os.O_EXCL | os.O_RDRW)
return os.fdopen(fd), file_name
except OSError:
pass
file_name = file_name_parts[0] + '_' + str(counter) + file_name_parts[1]
counter += 1
[संपादित करें] वास्तव में, एक बेहतर तरीका है, जो आप के लिए उपरोक्त मुद्दों को संभाल लेंगे, शायद है: उदाहरण के लिए, यहाँ अपने कोड इस दृष्टिकोण (एक (फ़ाइल लौटने, फ़ाइल का नाम) टपल) का उपयोग करने के लिए संशोधित है tempfile मॉड्यूल का उपयोग करने के लिए, हालांकि आप नामकरण पर कुछ नियंत्रण खो सकते हैं।यहाँ यह का उपयोग कर (एक समान अंतरफलक रखने) का एक उदाहरण है:
def unique_file(file_name):
dirname, filename = os.path.split(file_name)
prefix, suffix = os.path.splitext(filename)
fd, filename = tempfile.mkstemp(suffix, prefix+"_", dirname)
return os.fdopen(fd), filename
>>> f, filename=unique_file('/home/some_dir/foo.txt')
>>> print filename
/home/some_dir/foo_z8f_2Z.txt
इस दृष्टिकोण के साथ केवल नकारात्मक पक्ष यह है कि आप हमेशा उस में कुछ यादृच्छिक पात्रों के साथ एक फ़ाइल नाम मिल जाएगा, के रूप में वहाँ एक असंशोधित फ़ाइल बनाने के लिए कोई कोशिश नहीं की है (/home/some_dir/foo.txt) पहले। आप tempfile को भी देखना चाह सकते हैं। समकालीन फ़ाइल और नामांकित समकालीन फ़ाइल, जो उपर्युक्त करेगा और बंद होने पर स्वचालित रूप से डिस्क से भी हटा देगा।
हां, यह करने के लिए The_Right_Way है। काश मैं खुद को संशोधित कर सकता हूं और अपना जवाब शीर्ष पर रख सकता हूं! –
छोटे टाइपो: यह 'os.O_RDRW' की बजाय' os.O_RDWR' होना चाहिए – tremby