49 votes

Python - Comment convertir "un descripteur au niveau du système d'exploitation en fichier ouvert" en un objet fichier?

tempfile.mkstemp() retourne:

un tuple contenant un OS au niveau de la poignée pour ouvrir un fichier (comme ce serait retourné par l'os.open()) et le chemin absolu du fichier, dans cet ordre.

Comment puis-je convertir des OS au niveau de la poignée pour un objet de fichier?

La documentation pour les os.open() membres:

Pour envelopper un descripteur de fichier dans un fichier " objet", utilisez la fonction().

J'ai donc essayé:

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

51voto

Peter Hoffmann Points 13823

Vous pouvez utiliser

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

écrire à la poignée.

Si vous voulez ouvrir la poignée pour écrire, vous devez ajouter le mode "w"

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

13voto

Daryl Spitzer Points 18304

Voici comment faire en utilisant une instruction 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')
 

7voto

efotinis Points 6338

Vous avez oublié de spécifier le mode d'ouverture ('w') dans fdopen (). La valeur par défaut est 'r', ce qui entraîne l'échec de l'appel write ().

Je pense que mkstemp () crée le fichier en lecture seule. L'appel de fdopen avec 'w' le rouvrira probablement pour l'écriture (vous pouvez rouvrir le fichier créé par mkstemp).

4voto

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

2voto

Alex Coventry Points 11090

Quel est ton objectif, ici? tempfile.TemporaryFile inapproprié pour vos objectifs?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X