Python - Как преобразовать «дескриптор уровня ОС в открытый файл» в файловый объект? - PullRequest
49 голосов
/ 03 октября 2008

tempfile.mkstemp () возвращает:

кортеж, содержащий дескриптор уровня ОС для открытого файла (как будет возвращено os.open ()) и абсолютный путь к этому файлу в указанном порядке.

Как преобразовать этот дескриптор уровня ОС в объект файла?

Документация для os.open () гласит:

Чтобы обернуть дескриптор файла в файл object ", используйте 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

Ответы [ 6 ]

51 голосов
/ 03 октября 2008

Вы можете использовать

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

для записи на ручку.

Если вы хотите открыть ручку для записи, вам нужно добавить "w" mode

f = os.fdopen(tup[0], "w")
f.write("foo")
13 голосов
/ 18 августа 2009

Вот как это сделать с помощью оператора 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')
6 голосов
/ 04 октября 2008

Вы забыли указать режим открытия ('w') в fdopen (). По умолчанию используется значение «r», что приводит к сбою вызова write ().

Я думаю, что mkstemp () создает файл только для чтения. Вызов fdopen с помощью 'w', вероятно, снова открывает его для записи (вы можете открыть файл, созданный mkstemp).

4 голосов
/ 10 марта 2010
temp = tempfile.NamedTemporaryFile(delete=False)
temp.file.write('foo\n')
temp.close()
2 голосов
/ 04 октября 2008

Какова ваша цель, здесь? tempfile.TemporaryFile не подходит для ваших целей?

0 голосов
/ 05 июня 2013

Я не могу комментировать ответы, поэтому я опубликую свой комментарий здесь:

Чтобы создать временный файл для доступа на запись, вы можете использовать tempfile.mkstemp и указать «w» в качестве последнего параметра, например:

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