2010-10-13 7 views
26

मैं इसमें कुछ सामग्री लिखने के लिए tempfile.NamedTemporaryFile() का उपयोग करना चाहता हूं और फिर उस फ़ाइल को खोलना चाहता हूं। मैंने निम्नलिखित कोड लिखा है:ppthon में tempfile.NamedTemporaryFile() का उपयोग कैसे करें

tf = tempfile.NamedTemporaryFile() 
tfName = tf.name 
tf.seek(0) 
tf.write(contents) 
tf.flush() 

लेकिन मैं इस फ़ाइल को खोलने में असमर्थ हूं और नोटपैड या इसी तरह के एप्लिकेशन में इसकी सामग्री देख रहा हूं। क्या इसे प्राप्त करने का कोई तरीका है? क्यों नहीं कर सकते मैं की तरह कुछ कार्य करें: अंत

+1

आपको 'tempfile' का उपयोग करने की आवश्यकता क्यों है? क्या आप सिर्फ एक सामान्य फ़ाइल का उपयोग नहीं कर सकते हैं, खासकर यदि आप इसे बाद में सहेजना चाहते हैं? –

+1

मैं इसे अपने सिस्टम पर सहेजना नहीं चाहता हूं। मैं सिर्फ उन सामग्री को नोटपैड या इसी तरह के एप्लिकेशन में एक टेक्स्ट के रूप में खोला जाना चाहता हूं और जब मैं उस एप्लिकेशन को बंद करता हूं तो फ़ाइल को हटाएं – Manoj

उत्तर

39

पर

os.system('start notepad.exe ' + tfName) 

यह दो कारणों में से एक हो सकता है:

सबसे पहले, डिफ़ॉल्ट रूप से अस्थायी फ़ाइल deleted as soon as it is closed है। इस उपयोग को ठीक करने के लिए:

tf = tempfile.NamedTemporaryFile(delete=False) 

और फिर इसे अन्य एप्लिकेशन में देखने के बाद मैन्युअल रूप से फ़ाइल को हटा दें।

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

+16

तो जब मैं इसके साथ काम करता हूं तो इसे हटाने का सबसे अच्छा तरीका क्या है? 'Tf.unlink'? 'Os.remove'? 'Path.remove'? –

+1

@ थॉमसएहल आप क्या उपयोग करेंगे? –

+0

आपको आयात जोड़ने की आवश्यकता है: 'आयात tempfile' का उपयोग करने के लिए। –

20

आप इसे संदर्भ प्रबंधक के साथ भी उपयोग कर सकते हैं ताकि फ़ाइल को दायरे से बाहर होने पर बंद/हटा दिया जाएगा। यदि संदर्भ प्रबंधक में कोड बढ़ता है तो इसे साफ़ भी किया जाएगा।

import tempfile 
with tempfile.NamedTemporaryFile() as temp: 
    temp.write('Some data') 
    temp.flush() 

    # do something interesting with temp before it is destroyed 
+3

ध्यान रखें कि आप वास्तव में विंडोज़ पर कुछ करने के लिए 'temp.name' को अन्य प्रक्रियाओं में पारित नहीं कर सकते हैं (जो ओपी का प्लेटफार्म प्रतीत होता है)। मैनुअल से: "क्या नाम को दूसरी बार फ़ाइल खोलने के लिए इस्तेमाल किया जा सकता है, जबकि नामित अस्थायी फ़ाइल अभी भी खुली है, प्लेटफार्मों में भिन्न होती है (इसे यूनिक्स पर इतना उपयोग किया जा सकता है; यह विंडोज एनटी या बाद में नहीं हो सकता है)।" – Vegard

+0

यह सुनिश्चित नहीं है कि यह किसी भी तरह से मदद करेगा, लेकिन Django ने नामांकित समकालीन फ़ाइल को ओवरराइट किया है, इसलिए यह विंडोज के साथ काम करेगा, इसलिए यह देखने के लायक हो सकता है कि उन्होंने ऐसा करने के लिए क्या किया: https://code.djangoproject.com/wiki/NamedTemporaryFile – vjimw

+2

ऐसा प्रतीत होता है कि 'फ्लश' को कॉल करना आवश्यक है (अन्यथा, मुझे फ़ाइल से पढ़ने के लिए बुलाए गए उपप्रोसेसर में त्रुटि मिलती है)। –

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