web-dev-qa-db-fra.com

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

J'ai un python avec deux options - Téléchargement de fichier et textarea. Je dois prendre les valeurs de chacune et les transmettre à Un autre programme en ligne de commande.Je peux facilement transmettre le nom de fichier avec les options de téléchargement, mais je ne sais pas comment transmettre la valeur de textarea.

Je pense que ce que je dois faire est:

  1. Générer un nom de fichier unique
  2. Créer un fichier temporaire avec ce nom dans le répertoire de travail
  3. Sauvegarder les valeurs passées de textarea dans le fichier temporaire
  4. Exécutez le programme en ligne de commande depuis mon module python et transmettez-lui 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 manière de générer un nom de fichier unique? Tous les algorithmes, suggestions et lignes de code sont appréciés.

Merci pour votre sollicitude

80
MysticCodes

Je ne pensais pas que votre question était très claire, mais si vous avez simplement besoin d’un nom de fichier unique ...

import uuid

unique_filename = str(uuid.uuid4())
123
EnigmaCurry

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

Incidemment, vous dites que vous exécutez des commandes à partir d'un programme Python? Vous devriez certainement utiliser le module sous-processus .

Vous pouvez donc écrire un code qui ressemble à ceci:

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 exécutant cela, vous devriez constater que la commande cat a parfaitement fonctionné, mais que le fichier temporaire a été supprimé du bloc finally. Sachez que vous devez pour supprimer le fichier temporaire que mkstemp () vous renvoie - la bibliothèque n'a aucun moyen de savoir quand vous en aurez fini!

(Edit: j'avais supposé que NamedTemporaryFile faisait exactement ce que vous recherchiez, mais ce n'est peut-être pas très pratique: le fichier est supprimé immédiatement lorsque l'objet de fichier temporaire est fermé, et les autres processus l'ouvrent avant que vous ne l'ayez fermé. ne fonctionnera pas sur certaines plates-formes, notamment Windows. Désolé, échec de ma part.)

49
Richard Barrell

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

import uuid
filename = uuid.uuid4().hex

Les sorties 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
21
Grey Li

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 que vous ne supprimez pas le fichier après la fermeture.

13

Vous pouvez utiliser le module datetime

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.

Ça y est, cela vous donnera un nom de fichier unique à chaque fois.

6
Nimish Agrawal

Je suis tombé sur cette question, et je vais ajouter ma solution pour ceux qui cherchent peut-être quelque chose de similaire. Mon approche consistait simplement à créer un nom de fichier aléatoire à partir de ascii caractères. Ce sera unique avec une bonne probabilité.

from random import sample
from string import digits, ascii_uppercase, ascii_lowercase
from tempfile import gettempdir
from os import path

def Rand_fname(suffix, length=8):
    chars = ascii_lowercase + ascii_uppercase + digits

    fname = path.join(gettempdir(), 'tmp-'
                + ''.join(sample(chars, length)) + suffix)

    return fname if not path.exists(fname) \
                else Rand_fname(suffix, length)
1
behzad.nouri

Cela peut être fait en utilisant la fonction nique dans le module fp.path.

import ufp.path
ufp.path.unique('./test.ext')

si le chemin actuel existe, le fichier 'test.ext'. La fonction ufp.path.unique renvoie './test (d1) .ext'.

1
c2o93y50