Was ist in Python eine gute oder beste Möglichkeit, zufälligen Text zu generieren, um einer Datei (einem Namen), die ich auf einem Server speichere, vorangestellt zu werden, um sicherzustellen, dass sie nicht überschrieben wird? Danke dir!
Python verfügt über Funktionen zum Generieren temporärer Dateinamen (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, auf deren Namen mit dem .name
Attribut zugegriffen werden kann, 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. Hinweis : Standardmäßig wird die Datei beim Schließen gelöscht . Wenn der delete
Parameter 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 die Arbeit mit temporären Dateien finden Sie hier
Sie können das UUID-Modul zum Generieren einer zufälligen Zeichenfolge verwenden:
Dies ist eine gültige Wahl, da es äußerst unwahrscheinlich ist , dass ein UUID- Generator einen doppelten Bezeichner (in diesem Fall einen Dateinamen) erzeugt:
quelle
uuid.uuid4().hex
, um eine Hex-Zeichenfolge ohne Bindestriche (-
) zu erhalten.Ein gängiger Ansatz besteht darin, dem Dateinamen einen Zeitstempel als Präfix / Suffix hinzuzufügen, um eine zeitliche Beziehung zur Datei herzustellen. Wenn Sie mehr Eindeutigkeit benötigen, können Sie dieser noch eine zufällige Zeichenfolge hinzufügen.
quelle
1. Test if file exists, 2. create file.
Wenn ein anderer Prozess Ihren zwischen den Schritten 1 und 2 unterbricht und die Datei erstellt, überschreibt der Code bei Wiederaufnahme des Codes die Datei des anderen Prozesses.tempfile
Modul verwenden, das dies für Sie erledigt. :)...strftime("%y%m%d_%H%M%S%f")
Das OP forderte an, zufällige Dateinamen und keine zufälligen Dateien zu erstellen . Zeiten und UUIDs können kollidieren. Wenn Sie auf einem einzelnen Computer arbeiten (kein freigegebenes Dateisystem) und Ihr Prozess / Thread nicht auf sich selbst stampft, 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 Multithread-fähig sind, rufen Sie die Thread-ID ab. Wenn Sie andere Aspekte Ihres Codes haben, in denen ein einzelner Thread oder Prozess mehrere verschiedene Tempfiles generieren kann, müssen Sie möglicherweise eine andere Technik verwenden. Ein fortlaufender Index kann funktionieren (wenn Sie ihn nicht so lange aufbewahren oder so viele Dateien verwenden, würden Sie sich über einen Rollover Gedanken machen). In diesem Fall würde es ausreichen, einen globalen Hash / Index für "aktive" Dateien beizubehalten.
Entschuldigen Sie die langwierige Erklärung, aber sie hängt von Ihrer genauen Verwendung ab.
quelle
Wenn Sie keinen Dateipfad benötigen, sondern nur die zufällige Zeichenfolge mit vordefinierter Länge, können Sie so etwas verwenden.
quelle
Wenn Sie den ursprünglichen Dateinamen als Teil des neuen Dateinamens beibehalten möchten, können mithilfe von MD5-Hashes der aktuellen Zeit eindeutige Präfixe mit einheitlicher Länge generiert werden:
Aufrufe des add_prefix ('style.css') erzeugen eine Sequenz wie:
quelle
Fügen Sie hier meine zwei Cent hinzu:
Laut dem Python-Dokument für tempfile.mkstemp wird eine temporäre Datei auf möglichst sichere Weise erstellt. Bitte beachten Sie, dass die Datei nach diesem Aufruf vorhanden sein wird:
quelle
Ich persönlich bevorzuge es, wenn mein Text nicht nur zufällig / einzigartig, sondern auch schön ist. Deshalb mag ich die Hashids-Bibliothek, die gut aussehenden zufälligen Text aus ganzen Zahlen generiert. Kann durch installiert werden
pip install hashids
Snippet:
Kurze Beschreibung:
quelle
Sie können 'string.ascii_letters' in ein beliebiges Zeichenfolgenformat ändern, wenn Sie einen anderen Text generieren möchten, z. B. mobile NO, ID ...
quelle
quelle
Sie könnten das Zufallspaket verwenden:
quelle