मैं उपयोग कर एक tmp फ़ाइल बना रहा हूँ:

from tempfile import mkstemp

मैं इस फाइल में लिखने की कोशिश कर रहा हूँ:

tmp_file = mkstemp()
file = open(tmp_file, 'w')
file.write('TEST\n')

वास्तव में मैं फ़ाइल को बंद करता हूं और इसे उचित करता हूं, लेकिन जब मैं tmp फ़ाइल को कैट करने की कोशिश करता हूं, तो यह खाली रहती है..यह बुनियादी दिखती है, लेकिन मुझे नहीं पता कि यह काम क्यों नहीं करती है, कोई स्पष्टीकरण?

18
Steeven_b 18 जुलाई 2016, 15:40
हां, मैं यह करता हूं। file.close (), मैंने fd प्राप्त करने और os.close (fd) का उपयोग करके इसे बंद करने का भी प्रयास किया
 – 
Steeven_b
18 जुलाई 2016, 15:48

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)
25
user94559 18 जुलाई 2016, 16:05
खैर, मैंने दोनों का उपयोग करने की कोशिश की, जब मैं पथ = mkstemp() करता हूं, यह केवल फ़ाइल का पथ देता है। और यह अभी भी फ़ाइल को सही रास्ते पर बनाता है, इसलिए मुझे लगता है कि यह समस्या नहीं है।
 – 
Steeven_b
18 जुलाई 2016, 15:58
मैं नहीं देखता कि यह कैसे हो सकता है। यदि आप path = mkstemp(); print(path) करते हैं, तो आउटपुट क्या है? मुझे पूरा यकीन है कि यह एक टुपल होना चाहिए।
 – 
user94559
18 जुलाई 2016, 16:00
आप पायथन का किस संस्करण का उपयोग कर रहे हैं? (शायद पुराने संस्करणों का व्यवहार अलग है।)
 – 
user94559
18 जुलाई 2016, 16:00
1
मेरी गलती, मैंने fd, temp_file = mkstemp() प्रिंट '\n' + temp_file किया, मैंने इसे देखा भी नहीं था। तो हाँ, आप सही कह रहे हैं कि यह एक टपल लौटाता है, समय की बर्बादी के लिए क्षमा करें :( @ smarx
 – 
Steeven_b
18 जुलाई 2016, 16:03
मैंने एक टिप्पणी जोड़ने की कोशिश की लेकिन इसे ठीक से स्वरूपित नहीं किया जाएगा। इसलिए मैंने इसे एक उत्तर के रूप में जोड़ा।
 – 
Guido van Steen
1 मई 2018, 11:50

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
34
Scheintod 3 अगस्त 2021, 23:33
6
मुझे लगता है कि यह समाधान बेहतर है, लेकिन आपको open() के बजाय os.fdopen() का उपयोग करने की आवश्यकता है। (कम से कम अजगर 2.7 में, मुझे अजगर 3 के बारे में निश्चित नहीं है)
 – 
Jonah T
14 जून 2018, 20:34
2
हाँ, आयात ओएस; tempfile आयात mkstemp से; fd, पथ = mkstemp() <\n> os.fdopen(fd, 'w') के साथ f: f.write('TEST\n') के साथ अजगर 2 और 3 के बीच संगत है।
 – 
Guido van Steen
15 जून 2018, 22:33

यह उदाहरण पायथन फ़ाइल डिस्क्रिप्टर को 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)
3
Mike T 27 मार्च 2019, 10:41

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 का उपयोग करने की कोई आवश्यकता नहीं है, क्योंकि फ़ाइल वैसे भी बाहर निकलने पर बंद है। लेकिन वह खराब प्रोग्रामिंग अभ्यास है।

2
jcomeau_ictx 8 जुलाई 2021, 03:28