En Python, lo que es un bien, o la mejor manera de generar algo de texto al azar para anteponer un archivo(nombre) que estoy ahorrando para un servidor, sólo para asegurarse de que no se sobrescribe. Gracias!

InformationsquelleAutor zallarak | 2012-05-08

10 Comentarios

  1. 96

    Python dispone de instalaciones para generar nombres de archivo temporal, ver http://docs.python.org/library/tempfile.html. Por ejemplo:

    In [4]: import tempfile

    Cada llamada a tempfile.NamedTemporaryFile() resultados en otro archivo temporal, y su nombre se puede acceder con la .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 que puede ser utilizado como cualquier archivo normal. Nota: Por defecto, el archivo será eliminado cuando es
    cerrado. Sin embargo, si el delete parámetro es False, el archivo no se encuentra
    elimina automáticamente.

    Completo set 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 diversos parámetros que pueden ser suministrados 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'

    Ejemplos adicionales para trabajar con los archivos temporales se pueden encontrar aquí

    • Sería los archivos se eliminan la próxima vez que reinicie mi equipo?
    • El problema con esta solución es que se genera no sólo un nombre de archivo, pero también un archivo que ya está abierto. Si usted necesita un nombre de archivo temporal para una nueva, aún no existente archivo (por ejemplo, para usar como salida de un comando os), esto no va a hacer. En ese caso, puedes hacer algo como str(uuid.uuid4()) .
    • Gracias por el comentario adicional, que es útil, y señaló como referencia para el futuro. Sin embargo, OP claramente que él/ella quería guardar un archivo, de ahí la necesidad de abrir, por lo que esta solución proporciona para que.
    • Depende. Tal vez él necesita el nombre para la construcción de un servidor adecuado de la llamada. No estoy seguro. En cualquier caso, la respuesta es sin duda el caso más común.
  2. 87

    Podría utilizar el UUID módulo para generar una cadena aleatoria:

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

    Esta es una opción válida, dado que un UUID generador es muy improbable que se produzca un identificador duplicado (un nombre de archivo, en este caso):

    Sólo después de la generación de 1 mil millones de Uuid de cada segundo durante los próximos 100 años, la probabilidad de crear un duplicado sería de alrededor de 50%. La probabilidad de un duplicado sería de alrededor de 50% si cada persona en la tierra que posee 600 millones de Uuid.

    • esto también es muy útil cuando se desea un nombre de archivo único, pero no lo quiero creado todavía.
    • O uso uuid.uuid4().hex para obtener una cadena hexadecimal sin guiones (-).
  3. 14

    un enfoque común es agregar una marca de tiempo como un prefijo/sufijo para el nombre de archivo a tener alguna relación temporal para el archivo. Si usted necesita más de la singularidad de que usted todavía puede añadir una cadena al azar a este.

    import datetime
    basename = "mylogfile"
    suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
    filename = "_".join([basename, suffix]) # e.g. 'mylogfile_120508_171442'
    • En un entorno multiproceso, es posible una condición de carrera que participan en la secuencia 1. Test if file exists, 2. create file. Si hay otro proceso que interrumpe el tuyo entre los pasos 1 y 2, y crea el archivo, cuando el código se reanuda sobrescribirá el otro proceso de archivo.
    • Además también puede utilizar 6-8 carácter aleatorio de la secuencia (en el caso 2 archivos son generados en el mismo segundo).
    • O usted podría utilizar el tempfile módulo, que se encarga de esto para usted. 🙂
  4. 7

    El OP solicitado para crear al azar nombres no al azar archivos. Los tiempos y los Uuid puede chocar. Si usted está trabajando en una sola máquina (no es un sistema de archivos compartidos) y su proceso/subproceso no va a pisar fuerte en itselfk, el uso del sistema operativo.getpid (), para obtener su propia PID y utilizar esto como un elemento de un nombre de archivo único. Otros procesos, evidentemente, no obtener el mismo PID. Si usted es multiproceso, obtener el identificador de subproceso. Si usted tiene otros aspectos de su código en el que un único subproceso o proceso podría generar múltiples diferentes tempfiles, usted podría necesitar el uso de otra técnica. Un rodillo de índice puede trabajar (si usted no tiene mucho tiempo o el uso de tantos archivos que le preocupe acerca de la transferencia). Mantener un global de hash/index «activo» de los archivos sería suficiente en este caso.

    Así que lo siento por los prolijos explicación, pero no depende de el uso exacto.

  5. 7

    Si usted no necesita la ruta de acceso del archivo, pero sólo el azar cadena con longitud predefinida se puede usar algo como esto.

    >>> import random
    >>> import string
    
    >>> file_name = ''.join(random.choice(string.ascii_lowercase) for i in range(16))
    >>> file_name
    'ytrvmyhkaxlfaugx'
  6. 5

    Si desea conservar el original nombre de archivo como parte del nombre de archivo nuevo, único prefijos de unifom longitud puede ser generted por:

    def add_prefix(filename):
    
      from hashlib import md5
      from time import localtime
    
      return "%s_%s" % (md5(str(localtime())).hexdigest(), filename)

    Llamadas a la àdd_prefix («estilo.css’) genera la secuencia como:

    a38ff35794ae366e442a0606e67035ba_style.css
    7a5f8289323b0ebfdbc7c840ad3cb67b_style.css
    • A evitar: Unicode-de objetos deben ser codificados antes de hash he cambiado a md5(str(localtime()).encode(‘utf-8’)).hexdigest()
  7. 1

    Añadir mi granito de arena aquí:

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

    De acuerdo con el python doc para tempfile.mkstemp, se crea un archivo temporal en la más segura manera posible. Por favor, tenga en cuenta que el archivo existe después de esta llamada:

    In [20]: os.path.exists(tempfile.mkstemp('.png', 'bingo', '/tmp')[1])
    Out[20]: True
  8. 0

    Yo personalmente prefiero tener mi texto para que no sea sólo random/único, pero bella, por eso me gusta la hashids lib, que genera aspecto agradable de texto al azar de los números enteros.
    Puede instalar a través de

    pip install hashids

    Fragmento:

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

    Descripción Corta:

    Hashids es una pequeña fuente abierta de la biblioteca que genera corto, único, no secuencial identificadores de los números.

  9. 0
    >>> import random
    >>> import string    
    >>> alias = ''.join(random.choice(string.ascii_letters) for _ in range(16))
    >>> alias
    'WrVkPmjeSOgTmCRG'

    Que podría cambiar la ‘cadena.ascii_letters’ a cualquier formato de cadena como te gusta a generar cualquier otro texto, por ejemplo el móvil NO, ID…
    La mejor manera de generar al azar los nombres de archivo en Python

  10. -1

    Podría utilizar el azar paquete:

    import random
    file = random.random()
    • archivo = str( al azar.aleatorio() )
    • Esta es la generación de números aleatorios, no un texto al azar.

Dejar respuesta

Please enter your comment!
Please enter your name here