118 votes

Python : Comment créer un nom de fichier unique ?

J'ai un formulaire web en python avec deux options - Téléchargement de fichiers y zone de texte . Je dois prendre les valeurs de chacun d'eux et les transmettre à un autre programme en ligne de commande. Je peux facilement transmettre le nom du fichier avec les options de téléchargement de fichier, mais je ne sais pas comment transmettre la valeur de la zone de texte.

Je pense que ce que je dois faire, c'est.. :

  1. Générer un nom de fichier unique
  2. Créer un fichier temporaire portant ce nom dans le répertoire de travail
  3. Enregistrer les valeurs transmises par la zone de texte dans le fichier temporaire
  4. Exécuter le programme en ligne de commande à l'intérieur de mon module python et lui transmettre le nom du fichier temporaire.

Je ne sais pas comment générer un nom de fichier unique. Quelqu'un peut-il me donner des conseils sur la façon de générer un nom de fichier unique ? Tous les algorithmes, suggestions et lignes de code sont les bienvenus.

Merci de votre attention

174voto

EnigmaCurry Points 2311

Je n'ai pas trouvé votre question très claire, mais si tout ce dont vous avez besoin est un nom de fichier unique...

import uuid

unique_filename = str(uuid.uuid4())

57voto

Richard Barrell Points 1952

Si vous souhaitez créer des fichiers temporaires en Python, il existe un module appelé fichier temporaire dans les bibliothèques standard de Python. Si vous voulez lancer d'autres programmes pour opérer sur le fichier, utilisez tempfile.mkstemp() pour créer des fichiers, et os.fdopen() pour accéder aux descripteurs de fichiers que mkstemp() vous donne.

Par ailleurs, vous dites que vous exécutez des commandes à partir d'un programme Python ? Vous devriez très certainement utiliser l'option sous-processus module.

Vous pouvez donc écrire allègrement du code qui ressemble à :

import subprocess
import tempfile
import os

(fd, filename) = tempfile.mkstemp()
try:
    tfile = os.fdopen(fd, "w")
    tfile.write("Hello, world!\n")
    tfile.close()
    subprocess.Popen(["/bin/cat", filename]).wait()        
finally:
    os.remove(filename)

En procédant de la sorte, vous devriez constater que le cat a parfaitement fonctionné, mais le fichier temporaire a été supprimé dans la commande finally bloc. Sachez que vous tienen de supprimer vous-même le fichier temporaire renvoyé par mkstemp() - la bibliothèque n'a aucun moyen de savoir quand vous en avez fini avec lui !

(Edit : j'avais supposé que NamedTemporaryFile faisait exactement ce que vous cherchez, mais ce n'est peut-être pas si pratique - le fichier est supprimé immédiatement lorsque l'objet temp file est fermé, et le fait que d'autres processus ouvrent le fichier avant que vous ne l'ayez fermé ne fonctionnera pas sur certaines plateformes, notamment Windows. Désolé, j'ai échoué).

48voto

Grey Li Points 2726

En uuid serait un bon choix, je préfère utiliser le module uuid.uuid4().hex comme nom de fichier aléatoire car il renverra une chaîne hexagonale sans tirets .

import uuid
filename = uuid.uuid4().hex

Les résultats devraient ressembler à ceci :

>>> import uuid
>>> uuid.uuid()
UUID('20818854-3564-415c-9edc-9262fbb54c82')
>>> str(uuid.uuid4())
'f705a69a-8e98-442b-bd2e-9de010132dc4'
>>> uuid.uuid4().hex
'5ad02dfb08a04d889e3aa9545985e304'  # <-- this one

19voto

Peut-être avez-vous besoin d'un fichier temporaire unique ?

import tempfile

f = tempfile.NamedTemporaryFile(mode='w+b', delete=False)

print f.name
f.close()

f est un fichier ouvert. delete=False signifie qu'il ne faut pas supprimer le fichier après la fermeture.

Si vous souhaitez contrôler le nom du fichier, vous pouvez utiliser les options suivantes prefix=... y suffix=... qui prennent des chaînes de caractères. Voir aussi https://docs.python.org/3/library/tempfile.html .

14voto

Nimish Agrawal Points 129

Vous pouvez utiliser le date module

import datetime
uniq_filename = str(datetime.datetime.now().date()) + '_' + str(datetime.datetime.now().time()).replace(':', '.')

Notez que : J'utilise replace car les deux points ne sont pas autorisés dans les noms de fichiers dans de nombreux systèmes d'exploitation.

C'est tout, cela vous donnera un nom de fichier unique à chaque fois.

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