2012-06-15 7 views
21

Estoy trabajando en un script de Python que necesita crear unos 50 archivos temporales distintos, que se anexan con frecuencia durante el transcurso del script y se fusionan al final. Estoy seguro de que el módulo tempfile puede hacer lo que necesito, pero no he podido averiguar cómo leer la documentación.Cómo usar el tempfile.NamedTemporaryFile() de Python?

Quiero usar archivos temporales, en lugar de variables, para conservar la memoria del sistema, ya que estos fragmentos de datos crecen a medida que el script procesa decenas de miles de otros archivos.

El siguiente fragmento de código es el hack Actualmente estoy usando para crear estos archivos (untemporarily) en un directorio untemporary:

item = (string from another file) # string must id file for future use 
tmpfile = 'tmpfiles/' + item 
if item not in totalitems: 
    totalitems.add(item) 
    with open(tmpfile, 'w') as itemfile: 
     output = some stuff 
     tmpfile.write(output) 
else: 
    with open(tmpfile, 'a') as itemfile: 
     output = different stuff 
     tmpfile.write(output) 

Creo que lo que necesito es tempfile.NamedTemporaryFile(). De acuerdo con documentation:

Ese nombre se puede recuperar del miembro de nombre del objeto de archivo.

Lamentablemente, no entiendo lo que eso significa. Solo necesito poder volver a llamar a cada archivo más tarde cuando vuelva a encontrar su "elemento" correspondiente en los archivos que estoy procesando. Supongo que esto es bastante directo y solo estoy siendo denso. En caso de que importe, tengo versiones de este script para Python 2.7.1 y 3.2.3. Solo necesito que uno o el otro trabaje; Creé ambos como un ejercicio de aprendizaje.

+0

posible duplicado de [Mejor manera de generar nombres de archivo al azar en Python] (http://stackoverflow.com/questions/10501247/best-way- to-generate-random-file-names-in-python) – Joe

+1

@Joe, Parte de esta pregunta parece ser un duplicado del hilo que ha vinculado. Parte de esto no es; ver el comentario debajo de la respuesta de Levon. – Gregory

+0

¿Por qué necesita que se nombren estos archivos? Si no tienen nombre (se borraron previamente), hay menos errores en términos de limpieza. Simplemente puede almacenar el objeto tmpfile, no su nombre, y luego llamar a 'seek (0)' para ir al principio a estar listo para leer ... o mmap su contenido, o acceder de otra manera a su gusto. –

Respuesta

34

"Ese nombre se puede recuperar del miembro de nombre del objeto de archivo".

significa que se puede obtener el nombre del archivo temporal creado de este modo:

In [4]: import tempfile 

In [5]: tf = tempfile.NamedTemporaryFile() 
In [6]: tf.name # retrieve the name of the temp file just created 
Out[6]: 'c:\\blabla\\locals~1\\temp\\tmptecp3i' 

Nota: Por defecto se elimina el archivo cuando está cerrado. Sin embargo, si el parámetro delete es False, el archivo no se elimina automáticamente. Vea el Python docs en esto para más información.

Como puede recuperar el nombre de cada uno de los 50 archivos temporales que desea crear, puede guardarlos, por ejemplo, en una lista, antes de volver a utilizarlos (como usted dice). Solo asegúrese de establecer el valor delete en consecuencia para que los archivos no desaparezcan cuando los cierre (en caso de que planee cerrarlos y luego vuelva a abrirlos).

me explicó cómo crear nombres de archivos temporales en más detalle aquí Best way to generate random file names in Python

+0

Gracias por el enlace al hilo con su respuesta original. Todavía no estoy seguro de cómo introducir el archivo en el valor de algún "elemento" variable. Me he dado cuenta de la idea de usar un diccionario para eso; ¿Esto parece apropiado siguiendo la línea 5 en su código anterior? 'item_tmpfile = {item: tf.name}'. Luego podría llamar 'item_tmpfile [item]'. – Gregory

+0

@pyrogerg Sí, creo que debería funcionar, asociaría el nombre de cada archivo temporal con un 'elemento' diferente, donde' item' sería la clave para recuperar el nombre de archivo temporal más adelante. Supongo que su diccionario tendría finalmente 50 entradas, ¿verdad? ¿Estás planeando cerrar los archivos entre usos? si es así, tenga en cuenta el parámetro 'delete'. – Levon

+0

Gracias por la sugerencia 'eliminar'; Lo entendí en tu respuesta original. Creo que estoy en el camino correcto ahora. Supongo que puedo usar estos archivos como cualquier otro en el transcurso del script, p. 'con abierto (item_tmpfiles [item]) como tf:'? – Gregory

Cuestiones relacionadas