web-dev-qa-db-ja.com

Python-「OSレベルのハンドルを開いているファイルに」をファイルオブジェクトに変換するにはどうすればよいですか?

tempfile.mkstemp() 戻り値:

開いているファイルへのOSレベルのハンドル(os.open()によって返される)とそのファイルの絶対パス名をこの順序で含むタプル。

そのOSレベルのハンドルをファイルオブジェクトに変換するにはどうすればよいですか?

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
49
Daryl Spitzer

使用できます

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

ハンドルに書き込みます。

書き込み用のハンドルを開きたい場合は、"w"モードを追加する必要があります

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

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')
13
Daryl Spitzer

Fdopen()でオープンモード( 'w')を指定するのを忘れました。デフォルトは「r」で、write()呼び出しは失敗します。

Mkstemp()は読み取り専用のファイルを作成すると思います。 'w'を指定してfdopenを呼び出すと、おそらく書き込み用に再度開きます(can mkstempによって作成されたファイルを再度開きます)。

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

ここであなたの目標は何ですか? tempfile.TemporaryFileあなたの目的には不適切ですか?

2
Alex Coventry

回答にコメントできないので、ここにコメントを投稿します。

書き込みアクセス用の一時ファイルを作成するには、tempfile.mkstempを使用して、次のように最後のパラメーターとして「w」を指定します。

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