Tengo un formulario web de Python con dos opciones: carga de archivos y área de texto . Necesito tomar los valores de cada uno y pasarlos a otro programa de línea de comandos. Puedo pasar fácilmente el nombre del archivo con las opciones de carga de archivos, pero no estoy seguro de cómo pasar el valor del área de texto.
Creo que lo que tengo que hacer es:
- Genere un nombre de archivo único
- Cree un archivo temporal con ese nombre en el directorio de trabajo
- Guarde los valores pasados de textarea en el archivo temporal
- Ejecute el programa de línea de comandos desde el interior de mi módulo de Python y páselo el nombre del archivo temporal
No estoy seguro de cómo generar un nombre de archivo único. ¿Alguien puede darme algunos consejos sobre cómo generar un nombre de archivo único? Se agradece cualquier algoritmo, sugerencia y línea de código.
Gracias por tu preocupación
Respuestas:
No creo que tu pregunta sea muy clara, pero si todo lo que necesitas es un nombre de archivo único ...
import uuid unique_filename = str(uuid.uuid4())
fuente
uuid.uuid4().hex
sería una mejor opción, ver detalles aquí .Si desea crear archivos temporales en Python, hay un módulo llamado tempfile en las bibliotecas estándar de Python. Si desea ejecutar otros programas para operar en el archivo, use tempfile.mkstemp () para crear archivos y os.fdopen () para acceder a los descriptores de archivo que le proporciona mkstemp ().
Por cierto, ¿dice que está ejecutando comandos desde un programa de Python? Es casi seguro que debería utilizar el módulo de subproceso .
Por lo que puede escribir código con bastante alegría que se parece a:
import subprocess import tempfile import os (fd, filename) = tempfile.mkstemp() try: tfile = os.fdopen(fd, "w") tfile.write("Hello, world!\n") tfile.close() subprocess.Popen(["/bin/cat", filename]).wait() finally: os.remove(filename)
Al ejecutar eso, debería encontrar que el
cat
comando funcionó perfectamente bien, pero el archivo temporal se eliminó en elfinally
bloque. Tenga en cuenta que usted tiene que borrar el archivo temporal que mkstemp () devuelve a sí mismo - la biblioteca no tiene manera de saber cuando haya terminado con él!(Editar: había supuesto que NamedTemporaryFile hizo exactamente lo que buscas, pero eso podría no ser tan conveniente: el archivo se elimina inmediatamente cuando se cierra el objeto del archivo temporal y otros procesos abren el archivo antes de cerrarlo. no funcionará en algunas plataformas, especialmente Windows. Lo siento, fallaré de mi parte).
fuente
El
uuid
módulo sería una buena opción, prefiero usaruuid.uuid4().hex
como nombre de archivo aleatorio porque devolverá una cadena hexadecimal sin guiones .import uuid filename = uuid.uuid4().hex
Las salidas deberían tener este aspecto:
>>> import uuid >>> uuid.uuid() UUID('20818854-3564-415c-9edc-9262fbb54c82') >>> str(uuid.uuid4()) 'f705a69a-8e98-442b-bd2e-9de010132dc4' >>> uuid.uuid4().hex '5ad02dfb08a04d889e3aa9545985e304' # <-- this one
fuente
¿Quizás necesitas un archivo temporal único?
import tempfile f = tempfile.NamedTemporaryFile(mode='w+b', delete=False) print f.name f.close()
f es un archivo abierto.
delete=False
significa no borrar el archivo después de cerrarlo.Si necesita controlar el nombre del archivo, hay argumentos opcionales
prefix=...
ysuffix=...
que toman cadenas. Consulte https://docs.python.org/3/library/tempfile.html .fuente
w+b
es el predeterminadomode
. El uso de cualquiertempfile
funcionalidad tiene la desventaja de los permisos de acceso a archivos incorrectos:tempfile
documentos para usaros.O_TMPFILE
como máscara, pero respeta la creación normal de archivosos.umask()
.Puedes usar el módulo de fecha y hora
import datetime uniq_filename = str(datetime.datetime.now().date()) + '_' + str(datetime.datetime.now().time()).replace(':', '.')
Tenga en cuenta que: lo estoy usando
replace
ya que los dos puntos no están permitidos en los nombres de archivo en muchos sistemas operativos.Eso es todo, esto le dará un nombre de archivo único cada vez.
fuente
Me encontré con esta pregunta y agregaré mi solución para aquellos que puedan estar buscando algo similar. Mi enfoque fue simplemente hacer un nombre de archivo aleatorio a partir de
ascii
caracteres. Será único con una buena probabilidad.from random import sample from string import digits, ascii_uppercase, ascii_lowercase from tempfile import gettempdir from os import path def rand_fname(suffix, length=8): chars = ascii_lowercase + ascii_uppercase + digits fname = path.join(gettempdir(), 'tmp-' + ''.join(sample(chars, length)) + suffix) return fname if not path.exists(fname) \ else rand_fname(suffix, length)
fuente
path.exists()
regresaFalse
y el momento en que un consumidor abre realmente el archivo.Esto se puede hacer usando la función única en el módulo ufp.path .
import ufp.path ufp.path.unique('./test.ext')
si existe la ruta actual, el archivo 'test.ext'. La función ufp.path.unique devuelve './test (d1) .ext'.
fuente
Para crear una ruta de archivo única, si existe, use el paquete aleatorio para generar un nuevo nombre de cadena para el archivo. Puede consultar el siguiente código para el mismo.
import os import random import string def getUniquePath(folder, filename): path = os.path.join(folder, filename) while os.path.exists(path): path = path.split('.')[0] + ''.join(random.choice(string.ascii_lowercase) for i in range(10)) + '.' + path.split('.')[1] return path
Ahora puede usar esta ruta para crear un archivo en consecuencia.
fuente
En caso de que necesite ID únicos breves como nombre de archivo, intente
shortuuid
, shortuuid usa letras minúsculas y mayúsculas y dígitos, y elimina caracteres de apariencia similar como l, 1, I, O y 0.>>> import shortuuid >>> shortuuid.uuid() 'Tw8VgM47kSS5iX2m8NExNa' >>> len(ui) 22
comparado con
>>> import uuid >>> unique_filename = str(uuid.uuid4()) >>> len(unique_filename) 36 >>> unique_filename '2d303ad1-79a1-4c1a-81f3-beea761b5fdf'
fuente