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>' |
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.
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
d’après https://docs.python.org/3/library/tempfile.html#tempfile.mkdtemp
tempfile.NamedTemportaryFile()
ettempfile.mkdtemp()
acceptent un paramètre nommé dir qui permet de spécifier le répertoire dans lequel tu veux créer ton fichier/répertoire temporaire