10.6. tempfile — Génération de fichiers et répertoires temporaires

Code source : Lib/tempfile.py


This module generates temporary files and directories. It works on all supported platforms.

In version 2.3 of Python, this module was overhauled for enhanced security. It now provides three new functions, NamedTemporaryFile(), mkstemp(), and mkdtemp(), which should eliminate all remaining need to use the insecure mktemp() function. Temporary file names created by this module no longer contain the process ID; instead a string of six random characters is used.

Also, all the user-callable functions now take additional arguments which allow direct control over the location and name of temporary files. It is no longer necessary to use the global tempdir and template variables. To maintain backward compatibility, the argument order is somewhat odd; it is recommended to use keyword arguments for clarity.

The module defines the following user-callable functions:

tempfile.TemporaryFile([mode='w+b'[, bufsize=-1[, suffix=''[, prefix='tmp'[, dir=None]]]]])

Return a file-like object that can be used as a temporary storage area. The file is created using mkstemp(). It will be destroyed as soon as it is closed (including an implicit close when the object is garbage collected). Under Unix, the directory entry for the file is removed immediately after the file is created. Other platforms do not support this; your code should not rely on a temporary file created using this function having or not having a visible name in the file system.

The mode parameter defaults to 'w+b' so that the file created can be read and written without being closed. Binary mode is used so that it behaves consistently on all platforms without regard for the data that is stored. bufsize defaults to -1, meaning that the operating system default is used.

The dir, prefix and suffix parameters are passed to mkstemp().

The returned object is a true file object on POSIX platforms. On other platforms, it is a file-like object whose file attribute is the underlying true file object. This file-like object can be used in a with statement, just like a normal file.

tempfile.NamedTemporaryFile([mode='w+b'[, bufsize=-1[, suffix=''[, prefix='tmp'[, dir=None[, delete=True]]]]]])

This function operates exactly as TemporaryFile() does, except that the file is guaranteed to have a visible name in the file system (on Unix, the directory entry is not unlinked). That name can be retrieved from the name attribute of the returned file-like object. Whether the name can be used to open the file a second time, while the named temporary file is still open, varies across platforms (it can be so used on Unix; it cannot on Windows NT or later). If delete is true (the default), the file is deleted as soon as it is closed.

The returned object is always a file-like object whose file attribute is the underlying true file object. This file-like object can be used in a with statement, just like a normal file.

Nouveau dans la version 2.3.

Nouveau dans la version 2.6: The delete parameter.

tempfile.SpooledTemporaryFile([max_size=0[, mode='w+b'[, bufsize=-1[, suffix=''[, prefix='tmp'[, dir=None]]]]]])

This function operates exactly as TemporaryFile() does, except that data is spooled in memory until the file size exceeds max_size, or until the file’s fileno() method is called, at which point the contents are written to disk and operation proceeds as with TemporaryFile(). Also, it’s truncate method does not accept a size argument.

Le fichier renvoyé a une méthode supplémentaire, rollover(), qui provoque la mise en écriture sur disque quelque soit la taille du fichier.

The returned object is a file-like object whose _file attribute is either a StringIO object or a true file object, depending on whether rollover() has been called. This file-like object can be used in a with statement, just like a normal file.

Nouveau dans la version 2.6.

tempfile.mkstemp([suffix=''[, prefix='tmp'[, dir=None[, text=False]]]])

Crée un fichier temporaire de la manière la plus sécurisée qui soit. Il n’y a pas d’accès concurrent (race condition) au moment de la création du fichier, en supposant que la plateforme implémente correctement l’option os.O_EXCL pour os.open(). Le fichier est seulement accessible en lecture et écriture par l’ID de l’utilisateur créateur. Si la plateforme utilise des bits de permissions pour indiquer si le fichier est exécutable, alors le fichier n’est exécutable par personne. Le descripteur de fichier n’est pas hérité par les processus fils.

À la différence de TemporaryFile(), l’utilisateur de mkstemp() est responsable de la suppression du fichier temporaire quand il n’en a plus besoin.

If suffix is specified, the file name will end with that suffix, otherwise there will be no suffix. mkstemp() does not put a dot between the file name and the suffix; if you need one, put it at the beginning of suffix.

If prefix is specified, the file name will begin with that prefix; otherwise, a default prefix is used.

If dir is specified, the file will be created in that directory; otherwise, a default directory is used. The default directory is chosen from a platform-dependent list, but the user of the application can control the directory location by setting the TMPDIR, TEMP or TMP environment variables. There is thus no guarantee that the generated filename will have any nice properties, such as not requiring quoting when passed to external commands via os.popen().

Si text est spécifié, cela indique si le fichier doit être ouvert en mode binaire (par défaut) ou en mode texte. Sur certaines plateformes, cela ne fait aucune différence.

mkstemp() renvoie un n-uplet contenant un descripteur (handle en anglais) au niveau du système d’exploitation vers un fichier ouvert (le même que renvoie os.open()) et le chemin d’accès absolu de ce fichier, dans cet ordre.

Nouveau dans la version 2.3.

tempfile.mkdtemp([suffix=''[, prefix='tmp'[, dir=None]]])

Crée un répertoire temporaire de la manière la plus sécurisée qu’il soit. Il n’y a pas d’accès concurrent (race condition) au moment de la création du répertoire. Le répertoire est accessible en lecture, en écriture, et son contenu lisible uniquement pour l’ID de l’utilisateur créateur.

L’utilisateur de mkdtemp() est responsable de la suppression du répertoire temporaire et de son contenu lorsqu’il n’en a plus besoin.

Les arguments prefix, suffix, et dir sont les mêmes que pour mkstemp().

mkdtemp() renvoie le chemin absolu du nouveau répertoire.

Nouveau dans la version 2.3.

tempfile.mktemp([suffix=''[, prefix='tmp'[, dir=None]]])

Obsolète depuis la version 2.3: Utilisez mkstemp() à la place.

Return an absolute pathname of a file that did not exist at the time the call is made. The prefix, suffix, and dir arguments are the same as for mkstemp().

Avertissement

Utiliser cette fonction peut introduire une faille de sécurité dans votre programme. Avant que vous n’ayez le temps de faire quoi que ce soit avec le nom de fichier renvoyé, quelqu’un peut l’utiliser. L’utilisation de mktemp() peut être remplacée facilement avec NamedTemporaryFile() en y passant le paramètre delete=False :

>>> f = NamedTemporaryFile(delete=False)
>>> f
<open file '<fdopen>', mode 'w+b' at 0x384698>
>>> f.name
'/var/folders/5q/5qTPn6xq2RaWqk+1Ytw3-U+++TI/-Tmp-/tmpG7V1Y0'
>>> f.write("Hello World!\n")
>>> f.close()
>>> os.unlink(f.name)
>>> os.path.exists(f.name)
False

The module uses a global variable that tell it how to construct a temporary name. They are initialized at the first call to any of the functions above. The caller may change them, but this is discouraged; use the appropriate function arguments, instead.

tempfile.tempdir

When set to a value other than None, this variable defines the default value for the dir argument to all the functions defined in this module.

If tempdir is unset or None at any call to any of the above functions, Python searches a standard list of directories and sets tempdir to the first one which the calling user can create files in. The list is:

  1. Le répertoire correspondant à la variable d’environnement TMPDIR.

  2. Le répertoire correspondant à la variable d’environnement TEMP.

  3. Le répertoire correspondant à la variable d’environnement TMP.

  4. Un emplacement dépendant à la plateforme :

    • On RiscOS, the directory named by the Wimp$ScrapDir environment variable.

    • Sur Windows, les répertoires C:\TEMP, C:\TMP, \TEMP, et \TMP, dans cet ordre.

    • Sur toutes les autres plate-formes, les répertoires /tmp, /var/tmp, et /usr/tmp, dans cet ordre.

  5. En dernier ressort, le répertoire de travail courant.

tempfile.gettempdir()

Return the directory currently selected to create temporary files in. If tempdir is not None, this simply returns its contents; otherwise, the search described above is performed, and the result returned.

Nouveau dans la version 2.3.

tempfile.template

Obsolète depuis la version 2.0: Use gettempprefix() instead.

When set to a value other than None, this variable defines the prefix of the final component of the filenames returned by mktemp(). A string of six random letters and digits is appended to the prefix to make the filename unique. The default prefix is tmp.

Older versions of this module used to require that template be set to None after a call to os.fork(); this has not been necessary since version 1.5.2.

tempfile.gettempprefix()

Return the filename prefix used to create temporary files. This does not contain the directory component. Using this function is preferred over reading the template variable directly.

Nouveau dans la version 1.5.2.