En Python, quel est le bon ou le meilleur moyen de générer du texte aléatoire à ajouter à un fichier (nom) que je sauvegarde sur un serveur, histoire de ne pas écraser le texte. Je vous remercie!
Python a la possibilité de générer des noms de fichiers temporaires, voir http://docs.python.org/library/tempfile.html . Par exemple:
In [4]: import tempfile
Chaque appel à tempfile.NamedTemporaryFile()
donne lieu à un fichier temporaire différent et son nom est accessible avec l’attribut .name
, par exemple:
In [5]: tf = tempfile.NamedTemporaryFile()
In [6]: tf.name
Out[6]: 'c:\\blabla\\locals~1\\temp\\tmptecp3i'
In [7]: tf = tempfile.NamedTemporaryFile()
In [8]: tf.name
Out[8]: 'c:\\blabla\\locals~1\\temp\\tmpr8vvme'
Une fois que vous avez le nom de fichier unique, il peut être utilisé comme n'importe quel fichier normal. Note: Par défaut, le fichier sera supprimé quand il sera fermé. Cependant, si le paramètre delete
est False, le fichier n'est pas automatiquement supprimé.
Ensemble complet de paramètres:
tempfile.NamedTemporaryFile([mode='w+b'[, bufsize=-1[, suffix=''[, prefix='tmp'[, dir=None[, delete=True]]]]]])
il est également possible de spécifier le préfixe du fichier temporaire (en tant que l'un des différents paramètres pouvant être fournis lors de la création du fichier):
In [9]: tf = tempfile.NamedTemporaryFile(prefix="zz")
In [10]: tf.name
Out[10]: 'c:\\blabla\\locals~1\\temp\\zzrc3pzk'
Vous trouverez d'autres exemples d'utilisation de fichiers temporaires ici
Vous pouvez utiliser le module UUID pour générer une chaîne aléatoire:
import uuid
filename = str(uuid.uuid4())
C'est un choix valable, étant donné qu'il est extrêmement peu probable qu'un générateur UUID génère un identificateur en double (un nom de fichier, dans ce cas):
Ce n’est qu’après avoir généré 1 milliard d’UUID par seconde pour les 100 prochaines années que la probabilité de créer un seul duplicata serait d’environ 50%. La probabilité d'un duplicata serait d'environ 50% si chaque personne sur terre possédait 600 millions d'UUID.
une approche courante consiste à ajouter un horodatage en tant que préfixe/suffixe au nom du fichier pour établir une relation temporelle avec le fichier. Si vous avez besoin de plus d'unicité, vous pouvez toujours ajouter une chaîne aléatoire à cela.
import datetime
basename = "mylogfile"
suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
filename = "_".join([basename, suffix]) # e.g. 'mylogfile_120508_171442'
Le PO a demandé de créer de manière aléatoire noms de fichiers pas au hasard des dossiers. Les temps et les UUID peuvent entrer en collision. Si vous travaillez sur une seule machine (pas un système de fichiers partagé) et que votre processus/thread ne bascule pas sur soi-même, utilisez os.getpid () pour obtenir votre propre PID et utilisez-le comme élément d'un fichier unique. Les autres processus n'auraient évidemment pas le même PID. Si vous êtes multithread, obtenez l'id du thread. Si vous avez d'autres aspects de votre code dans lesquels un seul thread ou processus peut générer plusieurs fichiers temporaires différents, vous devrez peut-être utiliser une autre technique. Un index glissant peut fonctionner (si vous ne le gardez pas trop longtemps ou si vous n'utilisez pas autant de fichiers, vous craindriez le roulement). Conserver un index/hachage global dans les fichiers "actifs" suffirait dans ce cas .
Désolé pour l’explication longue, mais cela dépend de votre utilisation exacte.
Si vous souhaitez conserver le nom de fichier d'origine en tant que partie du nouveau nom de fichier, les préfixes uniques de longueur uniforme peuvent être générés par:
def add_prefix(filename):
from hashlib import md5
from time import localtime
return "%s_%s" % (md5(str(localtime())).hexdigest(), filename)
Les appels à àdd_prefix ('style.css') génèrent une séquence telle que:
a38ff35794ae366e442a0606e67035ba_style.css
7a5f8289323b0ebfdbc7c840ad3cb67b_style.css
Si vous n'avez pas besoin du chemin du fichier, mais uniquement de la chaîne aléatoire ayant une longueur prédéfinie, vous pouvez utiliser quelque chose comme ceci.
import random
import string
file_name = ''.join([random.choice(string.ascii_lowercase) for i in range(16)])
Ajout de mes deux centimes ici:
In [19]: tempfile.mkstemp('.png', 'bingo', '/tmp')[1]
Out[19]: '/tmp/bingoy6s3_k.png'
Selon le document python pour tempfile.mkstemp, il crée un fichier temporaire de la manière la plus sécurisée 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
Personnellement, je préfère que mon texte ne soit pas seulement aléatoire/unique mais qu'il soit beau aussi, c'est pourquoi j'aime bien la librairie hashids lib, qui génère un texte agréable à la recherche de Nice à partir d'entiers. Peut être installé 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.