Python-如何转换";打开文件的操作系统级句柄;到文件对象?
返回: 一个元组,包含打开文件的操作系统级句柄(由OS.open()返回)和该文件的绝对路径名,按顺序排列 如何将操作系统级句柄转换为文件对象 各国: 将文件描述符包装在“文件”中 对象),使用fdopen() 所以我试着: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]) >>>
>>> 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")