Python - How do I convert “an OS-level handle to an open file” to a file object?

风格不统一 提交于 2019-12-03 06:13:35

问题


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('foo\n')
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
IOError: [Errno 9] Bad file descriptor

回答1:


You can use

os.write(tup[0], "foo\n")

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")



回答2:


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('foo\n')



回答3:


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).




回答4:


temp = tempfile.NamedTemporaryFile(delete=False)
temp.file.write('foo\n')
temp.close()



回答5:


What's your goal, here? Is tempfile.TemporaryFile inappropriate for your purposes?




回答6:


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")


来源:https://stackoverflow.com/questions/168559/python-how-do-i-convert-an-os-level-handle-to-an-open-file-to-a-file-object

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!