Python – How do I convert "an OS-level handle to an open file" to a file object?
Question:
tempfile.mkstemp() returns:
a tuple containing an OS-level handle to an open file (as would be returned by os.open()) and the absolute pathname of that file, in that order.
How do I convert that OS-level handle to a file object?
The documentation for os.open() states:
To wrap a file descriptor in a “file
object”, use fdopen().
So I tried:
>>> import tempfile
>>> tup = tempfile.mkstemp()
>>> import os
>>> f = os.fdopen(tup[0])
>>> f.write('foon')
Traceback (most recent call last):
File "<stdin>", line 1, in ?
IOError: [Errno 9] Bad file descriptor
Answers:
You can use
os.write(tup[0], "foon")
to write to the handle.
If you want to open the handle for writing you need to add the “w” mode
f = os.fdopen(tup[0], "w")
f.write("foo")
You forgot to specify the open mode (‘w’) in fdopen(). The default is ‘r’, causing the write() call to fail.
I think mkstemp() creates the file for reading only. Calling fdopen with ‘w’ probably reopens it for writing (you can reopen the file created by mkstemp).
What’s your goal, here? Is tempfile.TemporaryFile
inappropriate for your purposes?
Here’s how to do it using a with statement:
from __future__ import with_statement
from contextlib import closing
fd, filepath = tempfile.mkstemp()
with closing(os.fdopen(fd, 'w')) as tf:
tf.write('foon')
temp = tempfile.NamedTemporaryFile(delete=False)
temp.file.write('foon')
temp.close()
I can’t comment on the answers, so I will post my comment here:
To create a temporary file for write access you can use tempfile.mkstemp and specify “w” as the last parameter, like:
f = tempfile.mkstemp("", "", "", "w") # first three params are 'suffix, 'prefix', 'dir'...
os.write(f[0], "write something")
tempfile.mkstemp() returns:
a tuple containing an OS-level handle to an open file (as would be returned by os.open()) and the absolute pathname of that file, in that order.
How do I convert that OS-level handle to a file object?
The documentation for os.open() states:
To wrap a file descriptor in a “file
object”, use fdopen().
So I tried:
>>> import tempfile
>>> tup = tempfile.mkstemp()
>>> import os
>>> f = os.fdopen(tup[0])
>>> f.write('foon')
Traceback (most recent call last):
File "<stdin>", line 1, in ?
IOError: [Errno 9] Bad file descriptor
You can use
os.write(tup[0], "foon")
to write to the handle.
If you want to open the handle for writing you need to add the “w” mode
f = os.fdopen(tup[0], "w")
f.write("foo")
You forgot to specify the open mode (‘w’) in fdopen(). The default is ‘r’, causing the write() call to fail.
I think mkstemp() creates the file for reading only. Calling fdopen with ‘w’ probably reopens it for writing (you can reopen the file created by mkstemp).
What’s your goal, here? Is tempfile.TemporaryFile
inappropriate for your purposes?
Here’s how to do it using a with statement:
from __future__ import with_statement
from contextlib import closing
fd, filepath = tempfile.mkstemp()
with closing(os.fdopen(fd, 'w')) as tf:
tf.write('foon')
temp = tempfile.NamedTemporaryFile(delete=False)
temp.file.write('foon')
temp.close()
I can’t comment on the answers, so I will post my comment here:
To create a temporary file for write access you can use tempfile.mkstemp and specify “w” as the last parameter, like:
f = tempfile.mkstemp("", "", "", "w") # first three params are 'suffix, 'prefix', 'dir'...
os.write(f[0], "write something")