Python-如何转换";打开文件的操作系统级句柄;到文件对象?

Python-如何转换";打开文件的操作系统级句柄;到文件对象?,python,temporary-files,mkstemp,fdopen,Python,Temporary Files,Mkstemp,Fdopen,返回: 一个元组,包含打开文件的操作系统级句柄(由OS.open()返回)和该文件的绝对路径名,按顺序排列 如何将操作系统级句柄转换为文件对象 各国: 将文件描述符包装在“文件”中 对象),使用fdopen() 所以我试着: >>> import tempfile >>> tup = tempfile.mkstemp() >>> import os >>> f = os.fdopen(tup[0]) >>>

返回:

一个元组,包含打开文件的操作系统级句柄(由OS.open()返回)和该文件的绝对路径名,按顺序排列

如何将操作系统级句柄转换为文件对象

各国:

将文件描述符包装在“文件”中 对象),使用fdopen()

所以我试着:

>>> 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
导入临时文件 >>>tup=tempfile.mkstemp() >>>导入操作系统 >>>f=os.fdopen(tup[0]) >>>f.write('foo\n') 回溯(最近一次呼叫最后一次): 文件“”,第1行,是否在中? IOError:[Errno 9]错误的文件描述符 您可以使用

os.write(tup[0], "foo\n")
写入句柄

如果要打开句柄进行写入,需要添加“w”模式

f = os.fdopen(tup[0], "w")
f.write("foo")

您忘记在fdopen()中指定打开模式(“w”)。默认值为“r”,导致write()调用失败


我认为mkstemp()创建的文件仅用于读取。使用“w”调用fdopen可能会重新打开它进行写入(您可以重新打开由mkstemp创建的文件)。

您的目标是什么?
tempfile.TemporaryFile
是否不适合您的用途?

以下是如何使用with语句执行此操作:

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

我无法对答案发表评论,因此我将在此处发表我的评论:

要为写访问创建临时文件,可以使用tempfile.mkstemp并指定“w”作为最后一个参数,如:

f = tempfile.mkstemp("", "", "", "w") # first three params are 'suffix, 'prefix', 'dir'...
os.write(f[0], "write something")

行得通,谢谢。但是从技术上讲,fdopen返回一个文件对象(并且您传入一个文件描述符),因此如果我可以编辑您的答案,我会将其更改为“f=os.fdopen(tup[0],“w”);f.write(“foo”)。如果您不使用
os.fdopen
,您需要确保根据使用os.close(tup[0])关闭临时文件句柄。请记住将答案标记为“已接受”“如果对你有用的话。我不希望文件一关闭就被销毁。(我想确保文件是可见的。)然后您可以将delete=False传递给namedTemporaryFile“delete”参数是在版本2.6中添加的,因此这对较旧的Python版本不起作用。是否确实需要关闭
os.fdopen
返回一个
TextIOWrapper
,它的
\uuuuu exit\uuuuuu
结果是关闭它,并在Python 3.5(CPython)上进行了测试。
f = tempfile.mkstemp("", "", "", "w") # first three params are 'suffix, 'prefix', 'dir'...
os.write(f[0], "write something")