मैं उपयोग कर एक tmp फ़ाइल बना रहा हूँ:
from tempfile import mkstemp
मैं इस फाइल में लिखने की कोशिश कर रहा हूँ:
tmp_file = mkstemp()
file = open(tmp_file, 'w')
file.write('TEST\n')
वास्तव में मैं फ़ाइल को बंद करता हूं और इसे उचित करता हूं, लेकिन जब मैं tmp फ़ाइल को कैट करने की कोशिश करता हूं, तो यह खाली रहती है..यह बुनियादी दिखती है, लेकिन मुझे नहीं पता कि यह काम क्यों नहीं करती है, कोई स्पष्टीकरण?
4 जवाब
mkstemp()
फ़ाइल डिस्क्रिप्टर और पथ के साथ एक टपल लौटाता है। मुझे लगता है कि मुद्दा यह है कि आप गलत रास्ते पर लिख रहे हैं। (आप '(5, "/some/path")'
जैसे पथ पर लिख रहे हैं।) आपका कोड कुछ इस तरह दिखना चाहिए:
from tempfile import mkstemp
fd, path = mkstemp()
# use a context manager to open the file at that path and close it again
with open(path, 'w') as f:
f.write('TEST\n')
# close the file descriptor
os.close(fd)
path = mkstemp(); print(path)
करते हैं, तो आउटपुट क्या है? मुझे पूरा यकीन है कि यह एक टुपल होना चाहिए।
Smarx द्वारा उत्तर path
निर्दिष्ट करके फ़ाइल खोलता है। हालांकि, इसके बजाय fd
निर्दिष्ट करना आसान है। उस स्थिति में संदर्भ प्रबंधक फ़ाइल डिस्क्रिप्टर को स्वचालित रूप से बंद कर देता है:
from tempfile import mkstemp
fd, path = mkstemp()
# use a context manager to open (and close) file descriptor fd (which points to path)
with fdopen(fd, 'w') as f:
f.write('TEST\n')
# This causes the file descriptor to be closed automatically
open()
के बजाय os.fdopen()
का उपयोग करने की आवश्यकता है। (कम से कम अजगर 2.7 में, मुझे अजगर 3 के बारे में निश्चित नहीं है)
यह उदाहरण पायथन फ़ाइल डिस्क्रिप्टर को os.fdopen
से खोलता है। अच्छी चीजें लिखें, फिर इसे बंद करें (with
संदर्भ ब्लॉक के अंत में)। अन्य गैर-पायथन प्रक्रियाएं फ़ाइल का उपयोग कर सकती हैं। और अंत में फाइल को डिलीट कर दिया जाता है।
import os
from tempfile import mkstemp
fd, path = mkstemp()
with os.fdopen(fd, 'w') as fp:
fp.write('cool stuff\n')
# Do something else with the file, e.g.
# os.system('cat ' + path)
# Delete the file
os.unlink(path)
Mkstemp रिटर्न (fd, नाम) जहां fd एक ओएस-स्तरीय फ़ाइल डिस्क्रिप्टर है जो बाइनरी मोड में लिखने के लिए तैयार है; इसलिए आपको केवल os.write(fd, 'TEST\n')
, और फिर os.close(fd)
का उपयोग करना होगा।
open
या os.fdopen
का उपयोग करके फ़ाइल को फिर से खोलने की आवश्यकता नहीं है।
jcomeau@bendergift:~$ python
Python 2.7.16 (default, Apr 6 2019, 01:42:57)
[GCC 8.3.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> from tempfile import mkstemp
>>> fd, name = mkstemp()
>>> os.write(fd, 'TEST\n')
5
>>> print(name)
/tmp/tmpfUDArK
>>> os.close(fd)
>>>
jcomeau@bendergift:~$ cat /tmp/tmpfUDArK
TEST
कमांड-लाइन परीक्षण में, निश्चित रूप से, os.close
का उपयोग करने की कोई आवश्यकता नहीं है, क्योंकि फ़ाइल वैसे भी बाहर निकलने पर बंद है। लेकिन वह खराब प्रोग्रामिंग अभ्यास है।
संबंधित सवाल
जुड़े हुए प्रश्न
नए सवाल
python
पायथन एक बहु-प्रतिमान है, गतिशील रूप से टाइप किया हुआ, बहुउद्देशीय प्रोग्रामिंग भाषा है। यह एक साफ और एक समान वाक्यविन्यास सीखने, समझने और उपयोग करने के लिए त्वरित होने के लिए डिज़ाइन किया गया है। कृपया ध्यान दें कि अजगर 2 आधिकारिक तौर पर 01-01-2020 के समर्थन से बाहर है। फिर भी, संस्करण-विशिष्ट पायथन सवालों के लिए, [अजगर -२.०] या [अजगर -३.x] टैग जोड़ें। पायथन वेरिएंट (जैसे, ज्योथन, PyPy) या लाइब्रेरी (उदा।, पांडस और न्यूमपी) का उपयोग करते समय, कृपया इसे टैग में शामिल करें।