168 votes

Meilleur moyen de générer des noms de fichiers aléatoires en Python

En Python, quelle est la meilleure façon de générer un texte aléatoire à ajouter au début d'un fichier (nom) que j'enregistre sur un serveur, juste pour s'assurer qu'il n'est pas écrasé. Merci !

9voto

Aleš Kotnik Points 1237

Si vous souhaitez conserver le nom de fichier original comme partie du nouveau nom de fichier, des préfixes uniques de longueur uniforme peuvent être générés en utilisant des hachages MD5 de l'heure actuelle :

from hashlib import md5
from time import localtime

def add_prefix(filename):
    prefix = md5(str(localtime()).encode('utf-8')).hexdigest()
    return f"{prefix}_{filename}"

L'appel à la fonction add_prefix('style.css') génère une séquence comme :

a38ff35794ae366e442a0606e67035ba_style.css
7a5f8289323b0ebfdbc7c840ad3cb67b_style.css

1 votes

Pour éviter : Les objets Unicode doivent être encodés avant le hachage J'ai changé pour md5(str(localtime()).encode('utf-8')).hexdigest()

1 votes

Notez qu'un hachage de tout type de données (y compris un horodatage) ne garantit pas l'unicité en soi (pas plus qu'une séquence d'octets choisie au hasard).

5voto

shahins Points 876

J'ajoute mes deux cents ici :

In [19]: tempfile.mkstemp('.png', 'bingo', '/tmp')[1]
Out[19]: '/tmp/bingoy6s3_k.png'

Selon la doc python pour tempfile.mkstemp, il crée un fichier temporaire de la manière la plus sûre possible. Veuillez noter que le fichier existera après cet appel :

In [20]: os.path.exists(tempfile.mkstemp('.png', 'bingo', '/tmp')[1])
Out[20]: True

3voto

Asad Farooq Points 88

Comme la date et l'heure changent après chaque seconde, vous devez concaténer data-time avec uuid (Universally Unique Identifiers). Voici le code complet pour votre réponse

   import uuid
   imageName = '{}{:-%Y%m%d%H%M%S}.jpeg'.format(str(uuid.uuid4().hex), datetime.now())

1voto

user1767754 Points 460

Personnellement, je préfère que mon texte ne soit pas seulement aléatoire/unique mais aussi beau, c'est pourquoi j'aime la librairie hashids, qui génère du texte aléatoire joli à partir d'entiers. Peut être installée via

pip install hashids

Snippet :

import hashids
hashids = hashids.Hashids(salt="this is my salt", )
print hashids.encode(1, 2, 3)
>>> laHquq

Brève description :

Hashids est une petite bibliothèque open-source qui génère des identifiants courts, uniques et non séquentiels à partir de nombres.

1voto

Freman Zhang Points 41
>>> import random
>>> import string    
>>> alias = ''.join(random.choice(string.ascii_letters) for _ in range(16))
>>> alias
'WrVkPmjeSOgTmCRG'

Vous pouvez remplacer 'string.ascii_letters' par n'importe quel format de chaîne de caractères pour générer n'importe quel autre texte, par exemple le numéro de téléphone portable, l'identifiant... enter image description here

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