W Pythonie, co jest dobrym lub najlepszym sposobem na wygenerowanie losowego tekstu do dołączenia przed plikiem (nazwą), który zapisuję na serwerze, aby upewnić się, że nie zostanie nadpisany. Dziękuję Ci!
Odpowiedzi:
Python ma narzędzia do generowania tymczasowych nazw plików, zobacz http://docs.python.org/library/tempfile.html . Na przykład:
In [4]: import tempfile
Każde wywołanie tempfile.NamedTemporaryFile()
powoduje powstanie innego pliku tymczasowego, a do jego nazwy można uzyskać dostęp za pomocą .name
atrybutu, np .:
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'
Po uzyskaniu unikalnej nazwy pliku można go używać jak każdego zwykłego pliku. Uwaga : Domyślnie plik zostanie usunięty po zamknięciu. Jeśli jednak delete
parametr ma wartość False, plik nie jest automatycznie usuwany.
Pełny zestaw parametrów:
tempfile.NamedTemporaryFile([mode='w+b'[, bufsize=-1[, suffix=''[, prefix='tmp'[, dir=None[, delete=True]]]]]])
można również określić prefiks dla pliku tymczasowego (jako jeden z różnych parametrów, które można podać podczas tworzenia pliku):
In [9]: tf = tempfile.NamedTemporaryFile(prefix="zz")
In [10]: tf.name
Out[10]: 'c:\\blabla\\locals~1\\temp\\zzrc3pzk'
Dodatkowe przykłady pracy z plikami tymczasowymi można znaleźć tutaj
Możesz użyć modułu UUID do wygenerowania losowego ciągu:
import uuid
filename = str(uuid.uuid4())
Jest to słuszny wybór, biorąc pod uwagę, że jest bardzo mało prawdopodobne, aby generator UUID wygenerował zduplikowany identyfikator (w tym przypadku nazwę pliku):
Dopiero po wygenerowaniu 1 miliarda identyfikatorów UUID co sekundę przez następne 100 lat prawdopodobieństwo utworzenia tylko jednego duplikatu wyniosłoby około 50%. Prawdopodobieństwo jednego duplikatu wyniosłoby około 50%, gdyby każda osoba na Ziemi posiadała 600 milionów identyfikatorów UUID.
uuid.uuid4().hex
aby uzyskać ciąg szesnastkowy bez myślników ( -
).
powszechnym podejściem jest dodanie sygnatury czasowej jako przedrostka / przyrostka do nazwy pliku, aby uzyskać pewną tymczasową relację z plikiem. Jeśli potrzebujesz większej wyjątkowości, nadal możesz dodać do tego losowy ciąg.
import datetime
basename = "mylogfile"
suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
filename = "_".join([basename, suffix]) # e.g. 'mylogfile_120508_171442'
1. Test if file exists, 2. create file.
wystąpić sytuacja wyścigu. Jeśli inny proces przerwie twój między krokami 1 i 2 i utworzy plik, po wznowieniu kodu nadpisze plik innego procesu.
tempfile
modułu, który zajmie się tym za Ciebie. :)
...strftime("%y%m%d_%H%M%S%f")
OP zażądał utworzenia losowych nazw plików, a nie plików losowych . Czasy i identyfikatory UUID mogą się kolidować. Jeśli pracujesz na pojedynczej maszynie (nie na współdzielonym systemie plików) i twój proces / wątek nie nadepnie na siebiek, użyj os.getpid (), aby uzyskać własny PID i użyj go jako elementu unikalnej nazwy pliku. Inne procesy oczywiście nie otrzymałyby tego samego PID. Jeśli jesteś wielowątkowy, uzyskaj identyfikator wątku. Jeśli masz inne aspekty kodu, w których pojedynczy wątek lub proces może generować wiele różnych plików tymczasowych, może być konieczne użycie innej techniki. Rolling index może działać (jeśli nie przechowujesz ich tak długo lub nie używasz tak wielu plików, że martwisz się o przewijanie). W takim przypadku wystarczyłoby utrzymywanie globalnego skrótu / indeksu dla „aktywnych” plików.
Tak mi przykro z powodu długich wyjaśnień, ale zależy to od dokładnego użycia.
Jeśli chcesz zachować oryginalną nazwę pliku jako część nowej nazwy pliku, unikalne przedrostki o jednakowej długości można wygenerować za pomocą skrótów MD5 aktualnego czasu:
from hashlib import md5
from time import localtime
def add_prefix(filename):
prefix = md5(str(localtime()).encode('utf-8')).hexdigest()
return f"{prefix}_{filename}"
Wywołania add_prefix („style.css”) generują sekwencję taką jak:
a38ff35794ae366e442a0606e67035ba_style.css
7a5f8289323b0ebfdbc7c840ad3cb67b_style.css
Dodaję tutaj moje dwa centy:
In [19]: tempfile.mkstemp('.png', 'bingo', '/tmp')[1]
Out[19]: '/tmp/bingoy6s3_k.png'
Zgodnie z dokumentacją Pythona dla tempfile.mkstemp, tworzy plik tymczasowy w najbezpieczniejszy możliwy sposób. Pamiętaj, że plik będzie istniał po tym wywołaniu:
In [20]: os.path.exists(tempfile.mkstemp('.png', 'bingo', '/tmp')[1])
Out[20]: True
Osobiście wolę, aby mój tekst był nie tylko przypadkowy / unikalny, ale także piękny, dlatego podoba mi się hashids lib, który generuje ładnie wyglądający losowy tekst z liczb całkowitych. Można zainstalować przez
pip install hashids
Skrawek:
import hashids
hashids = hashids.Hashids(salt="this is my salt", )
print hashids.encode(1, 2, 3)
>>> laHquq
Krótki opis:
Hashids to mała biblioteka typu open source, która generuje krótkie, unikalne, niesekwencyjne identyfikatory z liczb.
>>> import random
>>> import string
>>> alias = ''.join(random.choice(string.ascii_letters) for _ in range(16))
>>> alias
'WrVkPmjeSOgTmCRG'
Możesz zmienić `` string.ascii_letters '' na dowolny format ciągu, tak jak chcesz generować dowolny inny tekst, na przykład numer telefonu komórkowego, identyfikator ...
import uuid
imageName = '{}{:-%Y%m%d%H%M%S}.jpeg'.format(str(uuid.uuid4().hex), datetime.now())
Możesz użyć losowego pakietu:
import random
file = random.random()