En Python, ¿cuál es una buena o la mejor manera de generar un texto aleatorio para anteponer a un archivo (nombre) que estoy guardando en un servidor, solo para asegurarme de que no se sobrescriba? ¡Gracias!
Python tiene funciones para generar nombres de archivos temporales, consulte http://docs.python.org/library/tempfile.html . Por ejemplo:
In [4]: import tempfile
Cada llamada a tempfile.NamedTemporaryFile()
da como resultado un archivo temporal diferente, y se puede acceder a su nombre con el .name
atributo, por ejemplo:
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'
Una vez que tenga el nombre de archivo único, puede utilizarlo como cualquier archivo normal. Nota : De forma predeterminada, el archivo se eliminará cuando se cierre. Sin embargo, si el delete
parámetro es Falso, el archivo no se elimina automáticamente.
Conjunto completo de parámetros:
tempfile.NamedTemporaryFile([mode='w+b'[, bufsize=-1[, suffix=''[, prefix='tmp'[, dir=None[, delete=True]]]]]])
También es posible especificar el prefijo para el archivo temporal (como uno de los varios parámetros que se pueden proporcionar durante la creación del archivo):
In [9]: tf = tempfile.NamedTemporaryFile(prefix="zz")
In [10]: tf.name
Out[10]: 'c:\\blabla\\locals~1\\temp\\zzrc3pzk'
Puede encontrar ejemplos adicionales para trabajar con archivos temporales aquí
Puede usar el módulo UUID para generar una cadena aleatoria:
Esta es una opción válida, dado que es muy poco probable que un generador de UUID produzca un identificador duplicado (un nombre de archivo, en este caso):
fuente
uuid.uuid4().hex
para obtener una cadena hexadecimal sin guiones (-
).un enfoque común es agregar una marca de tiempo como prefijo / sufijo al nombre del archivo para tener alguna relación temporal con el archivo. Si necesita más singularidad, aún puede agregar una cadena aleatoria a esto.
fuente
1. Test if file exists, 2. create file.
Si otro proceso interrumpe el suyo entre los pasos 1 y 2 y crea el archivo, cuando su código se reanude, sobrescribirá el archivo del otro proceso.tempfile
módulo, que se encarga de esto por usted. :)...strftime("%y%m%d_%H%M%S%f")
El OP solicitó crear nombres de archivo aleatorios, no archivos aleatorios . Los tiempos y los UUID pueden chocar. Si está trabajando en una sola máquina (no en un sistema de archivos compartido) y su proceso / subproceso no pisoteará a sí mismok, use os.getpid () para obtener su propio PID y utilícelo como un elemento de un nombre de archivo único. Obviamente, otros procesos no obtendrían el mismo PID. Si es multiproceso, obtenga el ID del hilo. Si tiene otros aspectos de su código en los que un solo hilo o proceso podría generar múltiples archivos temporales diferentes, es posible que deba usar otra técnica. Un índice continuo puede funcionar (si no los mantiene durante tanto tiempo o si usa tantos archivos, se preocuparía por la transferencia). En ese caso, sería suficiente mantener un hash / índice global para archivos "activos".
Lo siento por la explicación tan larga, pero depende de su uso exacto.
fuente
Si no necesita la ruta del archivo, pero solo la cadena aleatoria que tiene una longitud predefinida, puede usar algo como esto.
fuente
Si desea conservar el nombre de archivo original como parte del nuevo nombre de archivo, se pueden generar prefijos únicos de longitud uniforme utilizando hashes MD5 de la hora actual:
Las llamadas al add_prefix ('style.css') generan una secuencia como:
fuente
Añadiendo mis dos centavos aquí:
Según el documento de python para tempfile.mkstemp, crea un archivo temporal de la manera más segura posible. Tenga en cuenta que el archivo existirá después de esta llamada:
fuente
Personalmente, prefiero que mi texto no sea solo aleatorio / único, sino también hermoso, por eso me gusta la biblioteca hashids, que genera un texto aleatorio de aspecto agradable a partir de números enteros. Se puede instalar a través
pip install hashids
Retazo:
Breve descripción:
fuente
Puede cambiar 'string.ascii_letters' a cualquier formato de cadena que desee para generar cualquier otro texto, por ejemplo, NO móvil, ID ...
fuente
fuente
Puedes usar el paquete aleatorio:
fuente