web-dev-qa-db-ger.com

Der beste Weg, um zufällige Dateinamen in Python zu generieren

Was ist in Python eine gute oder der beste Weg, um zufälligen Text zu erzeugen, der einer Datei (dem Namen) vorangestellt wird, die ich auf einem Server speichere, nur um sicherzustellen, dass er nicht überschrieben wird. Vielen Dank!

73
zallarak

Python kann über temporäre Dateinamen verfügen, siehe http://docs.python.org/library/tempfile.html . Zum Beispiel:

In [4]: import tempfile

Jeder Aufruf von tempfile.NamedTemporaryFile() führt zu einer anderen temporären Datei, und auf seinen Namen kann mit dem .name-Attribut zugegriffen werden, z.

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'

Sobald Sie den eindeutigen Dateinamen haben, kann er wie jede normale Datei verwendet werden. Note: Standardmäßig ist die Datei gelöscht, wenn sie geschlossen ist. Wenn der Parameter delete jedoch False ist, wird die Datei nicht automatisch gelöscht

Vollständiger Parametersatz:

tempfile.NamedTemporaryFile([mode='w+b'[, bufsize=-1[, suffix=''[, prefix='tmp'[, dir=None[, delete=True]]]]]])

es ist auch möglich, das Präfix für die temporäre Datei anzugeben (als einen der verschiedenen Parameter, die während der Dateierstellung angegeben werden können):

In [9]: tf = tempfile.NamedTemporaryFile(prefix="zz")
In [10]: tf.name
Out[10]: 'c:\\blabla\\locals~1\\temp\\zzrc3pzk'

Weitere Beispiele für das Arbeiten mit temporären Dateien finden Sie hier

89
Levon

Sie können das Modul UUID verwenden, um eine zufällige Zeichenfolge zu generieren:

import uuid
filename = str(uuid.uuid4())

Dies ist eine gültige Wahl, da es unwahrscheinlich ist, dass ein UUID - Generator einen doppelten Bezeichner (in diesem Fall einen Dateinamen) erzeugt:

Nur wenn in den nächsten 100 Jahren pro Sekunde 1 Milliarde UUIDs generiert wurden, wäre die Wahrscheinlichkeit, ein einziges Duplikat zu erstellen, etwa 50%. Die Wahrscheinlichkeit eines Duplikats wäre etwa 50%, wenn jeder Mensch auf der Erde 600 Millionen UUIDs besitzt.

80
Óscar López

ein gängiger Ansatz ist, dem Dateinamen einen Zeitstempel als Präfix/Suffix hinzuzufügen, um eine zeitliche Beziehung zur Datei zu haben. Wenn Sie mehr Einzigartigkeit benötigen, können Sie dieser noch eine zufällige Zeichenfolge hinzufügen.

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

Das OP hat angefordert, zufällig zu erstellen dateinamen nicht zufällig dateien. Zeiten und UUIDs können kollidieren. Wenn Sie auf einem einzelnen Computer (nicht einem gemeinsam genutzten Dateisystem) arbeiten und Ihr Prozess/Thread nicht auf sich selbst abfällt, verwenden Sie os.getpid (), um Ihre eigene PID abzurufen und diese als Element eines eindeutigen Dateinamens zu verwenden. Andere Prozesse würden offensichtlich nicht die gleiche PID erhalten. Wenn Sie Multithreading verwenden, rufen Sie die Thread-ID ab. Wenn Sie andere Aspekte des Codes haben, in denen ein einzelner Thread oder Prozess mehrere unterschiedliche Empfängerdateien generieren kann, müssen Sie möglicherweise eine andere Methode verwenden. Ein rollierender Index kann funktionieren (wenn Sie sie nicht so lange halten oder so viele Dateien verwenden, dass Sie sich um Rollover sorgen müssten). In diesem Fall reicht es aus, einen globalen Hash/Index auf "aktive" Dateien zu belassen.

Tut mir leid für die langatmige Erklärung, aber es hängt von Ihrer genauen Verwendung ab.

7
Brad

Wenn Sie den ursprünglichen Dateinamen als Teil des neuen Dateinamens beibehalten möchten, können eindeutige Präfixe mit einheitlicher Länge durch Folgendes erzeugt werden:

def add_prefix(filename):

  from hashlib import md5
  from time import localtime

  return "%s_%s" % (md5(str(localtime())).hexdigest(), filename)

Aufrufe des àdd_prefix ('style.css') erzeugen eine Sequenz wie folgt:

a38ff35794ae366e442a0606e67035ba_style.css
7a5f8289323b0ebfdbc7c840ad3cb67b_style.css
5
Aleš Kotnik

Wenn Sie keinen Dateipfad benötigen, sondern nur die zufällige Zeichenfolge mit vordefinierter Länge, können Sie so etwas verwenden.

import random
import string

file_name = ''.join([random.choice(string.ascii_lowercase) for i in range(16)])
4
4xy

Meine zwei Cents hier hinzufügen:

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

Gemäß dem Python-Dokument für tempfile.mkstemp erstellt es eine temporäre Datei auf die sicherste Art und Weise. Bitte beachten Sie, dass die Datei nach diesem Aufruf vorhanden ist:

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'

Sie können 'string.ascii_letters' in ein beliebiges Zeichenfolgeformat ändern, wenn Sie anderen Text generieren möchten, z. B. Mobilnummer, ID ... enter image description here

0
Freman Zhang

Ich persönlich bevorzuge es, dass mein Text nicht nur zufällig/einzigartig, sondern auch schön ist. Aus diesem Grund mag ich die Hash-Bibliothek lib, die aus ganzen Zahlen einen schön aussehenden zufälligen Text generiert. Kann installiert werden 

pip install hashids

Snippet:

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

Kurze Beschreibung:

Hashids ist eine kleine Open-Source-Bibliothek, die kurze, eindeutige, nicht sequentielle IDs aus Zahlen generiert.

0
user1767754