web-dev-qa-db-fra.com

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

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!

73
zallarak

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

89
Levon

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.

80
Óscar López

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'
11
moooeeeep

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.

7
Brad

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
5
Aleš Kotnik

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)])
4
4xy

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
1
shahins
>>> 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 car vous souhaitez générer tout autre texte, par exemple, mobile NO, ID ... enter image description here

0
Freman Zhang

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.

0
user1767754