Fichiers temporaires avec tempfile en Python


Il est de ces petits modules qui sont tout simples et bien pratiques. Et la lib standard de Python en regorge. Aujourd’hui (cette nuit, ce matin, choisissez votre référentiel, pour moi c’est le petit dej), on va voir le module tempfile.

Il permet de manipuler des fichiers et dossiers – qui après tout sont des fichiers – temporaires, c’est à dire jetable, en quelque sorte.

Donc :

>>> import tempfile

Dossier temporaire

La fonction la plus simple permet d’obtenir le dossier de l’OS dans lequel on met généralement les fichiers temporaires, comme par exemple C:\TEMP, C:\TMP, /tmp, /var/tmp, ou /usr/tmp selon la machine, l’OS, les variables d’environnement. Sur ma machine :

>>> tempfile.gettempdir()
'/tmp'

Si vous avez juste besoin d’un dossier temporaire dans lequel travailler :

>>> tempfile.mkdtemp()
'/tmp/tmps01VJw'

Il va être créé et sera accessible en lecture et écriture pour l’utilisateur qui l’a créé (permissions 700 sous Linux par exemple). Le chemin est retourné sous forme de string, à charge de votre programme de le supprimer, ou laisser l’OS s’en charger naturellement au prochain reboot.

Fichier temporaire

Il existe plusieurs manière de créer un fichier temporaire avec ce module, mais je vous invite à utiliser principalement :

>>> f = tempfile.NamedTemporaryFile()
>>> f
<open file '<fdopen>', mode 'w+b' at 0x1b7fc00>
>>> f.name
'/tmp/tmp0FxO_c'

C’est la méthode la plus simple et la plus passe-partout. Vous pouvez oublier mktemp(), mkstemp(), TemporaryFile(), etc. Le fichier est automatiquement supprimé quand vous appelez close() dessus, à moins de passer False via le paramètre delete.

Au passage vous pouvez influencer le nom du fichier résultant en passant prefix, suffix, et dir en arguments.

>>> tempfile.NamedTemporaryFile(prefix='~').name
u'/tmp/~XAoApc'
>>> tempfile.NamedTemporaryFile(suffix="tmp").name
u'/tmp/tmpbirE0Jtmp'
>>> tempfile.NamedTemporaryFile(suffix=".tmp").name
u'/tmp/tmpm4iHXE.tmp'
>>> tempfile.NamedTemporaryFile(dir="/home/sam/.tmp").name
u'/home/sam/.tmp/tmpHfwhQI'
>>> tempfile.NamedTemporaryFile(dir="/home/sam/.tmp").name

mode et bufsize sont aussi disponibles, et seront relayés à file() sous le capot.

>>> tempfile.
tempfile.NamedTemporaryFile    tempfile.TMP_MAX               tempfile.gettempdir            tempfile.mkdtemp               tempfile.mktemp                tempfile.template
tempfile.SpooledTemporaryFile  tempfile.TemporaryFile         tempfile.gettempprefix         tempfile.mkstemp               tempfile.tempdir
>>> tempfile.get
tempfile.gettempdir     tempfile.gettempprefix
>>> tempfile.gettempdir()
'/tmp'

Une dernière astuce qui ne m’a jamais servi : tempfile.SpooledTemporaryFile(max_size=X). Similaire à NamedTemporaryFile, mais le fichier est uniquement en mémoire, et sera transformé en un fichier sur le disque si sa taille dépasse X octets. StringIO est utilisé pour la partie en RAM.

Le fait de demander son file descriptor (l’entier qui représente le fichier pour le programme) le fait aussi passer en mode “sur le disque” :

>>> a = tempfile.SpooledTemporaryFile(max_size=10000)
>>> a.name
Traceback (most recent call last):
  File "<ipython-input-43-c0a6f6c60584>", line 1, in <module>
    a.name
  File "/usr/lib/python2.7/tempfile.py", line 569, in name
    return self._file.name
AttributeError: 'cStringIO.StringO' object has no attribute 'name'
 
>>> a.fileno()
9
>>> a.name
'<fdopen>'

3 thoughts on “Fichiers temporaires avec tempfile en Python

  • Xavier Combelle

    Le fichier est automatiquement supprimé quand vous appelez close() dessus, à moins de passer True via le paramètre delete.

    ne devrait il pas être:

    Le fichier est automatiquement supprimé quand vous appelez close() dessus, à moins de passer False via le paramètre delete.

  • buffalo974

    Je ne souhaite pas que tempfile.mkdtemp() fasse un sous répertoire dans

    le répertoire C:\Users\moi\AppData\Local\Temp

    Comment faire si on est sur windows et que l’on veut que le fichier temporaire soit enregistré de le répertoire C:\user\moi\desktop\mon_projet_actuel

Comments are closed.

Des questions Python sans rapport avec l'article ? Posez-les sur IndexError.