Crear archivo temporal en Python

Jay Shaw 10 octubre 2023
  1. Crear archivo temporal en Python usando el módulo tempfile
  2. Crear un archivo temporal con nombre en Python
  3. Crear archivo temporal en Python usando la función mkstemp
  4. Crear un directorio temporal en Python
Crear archivo temporal en Python

Este artículo explica cómo crear un archivo y un directorio temporales en Python. Los archivos temporales en Python se generan utilizando el módulo tempfile.

Este artículo también explica cuatro subfunciones de tempfile, que son TemporaryFile, NamedTemporaryFile, mkstemp y TemporaryDirectory.

Crear archivo temporal en Python usando el módulo tempfile

Esta función crea un archivo temporal creado de forma segura en Python, que devuelve una región de almacenamiento que se asemeja a un archivo que se puede utilizar temporalmente. Se destruirá tan pronto como se cierre (incluido un cierre implícito cuando el objeto se recolecte como basura).

La sintaxis para usar esta función para crear un archivo temporal en Python es:

file = tempfile.TemporaryFile()
# 	OR
file = tempfile.TemporaryFile(
    mode="w+b",  # Remains as Default mode if not mentioned
    suffix=None,  # adds a suffix to file name
    prefix=None,  # adds prefix to file name
    # etc.
)

Este archivo temporal en Python se eliminará del sistema de archivos al finalizar el contexto (bloque con) o la destrucción del objeto de archivo file.close(). El nuevo archivo se puede leer y escribir sin cerrarlo porque el valor predeterminado del parámetro de modo es w+b.

Funciona en modo binario para mantener la coherencia en todos los sistemas, independientemente de los datos guardados. Algunos términos adicionales como almacenamiento en búfer, codificación, errores y nueva línea son parte de la función integrada de Python open(), que se puede usar dentro del parámetro.

El siguiente programa demuestra cómo crear un archivo temporal en Python usando TemporaryFile().

La primera línea de código importa el paquete de biblioteca tmpfile. Se crea una variable filepath que utiliza la función tempfile.TemporaryFile() para crear un archivo temporal.

Los datos se escriben dentro del archivo temporal usando la función filepath.write(). Este parámetro toma solo un valor de tipo byte, por lo que el literal b se agrega antes de la cadena.

La función filepath.seek(0) carga el archivo en el flujo de archivos a partir de la longitud 0.

La variable de impresión filepath muestra la dirección del objeto. Para verificar el nombre de archivo del archivo temporal, se imprime la función filepath.name().

La función filepath.read() lee los datos del archivo temporal y luego los imprime. Por último, el objeto de archivo temporal se libera mediante filepath.close().

import tempfile

filepath = tempfile.TemporaryFile()

filepath.write(b"Writing some stuff")
filepath.seek(0)

print(filepath)
print(filepath.name)

print(filepath.read())
filepath.close()

Producción :

"C:\Users\Win 10\venv\Scripts\python.exe" "C:/Users/Win 10/main.py"
<tempfile._TemporaryFileWrapper object at 0x00000285D92DAC50>
C:\Users\WIN10~1\AppData\Local\Temp\st.cq3d03ezloraine
b'Hello world!'

Process finished with exit code 0

Veamos otro programa.

Aquí la variable filepath utiliza tres parámetros de la subfunción TemporaryFile. El modo se establece como w+b, que significa lectura y escritura.

Además, un prefijo st. y se agrega un sufijo loarine al nombre del archivo. Los datos se escriben en el temporal y se imprime el nombre del archivo.

import tempfile

filepath = tempfile.TemporaryFile(
    mode="w+b",
    prefix="st.",  # adds prefix to file name
    suffix="loraine",  # adds a suffix to file name
)

filepath.write(b"Hello world!")

print(filepath.name)

filepath.close()

Se puede ver que el prefijo y el sufijo se han agregado al nombre del archivo.

"C:\Users\Win 10\venv\Scripts\python.exe" "C:/Users/Win 10/main.py"
C:\Users\WIN10~1\AppData\Local\Temp\st.kepthvu_loraine

Process finished with exit code 0

Se puede ver que el archivo temporal se había cerrado explícitamente al final del programa. Hacer esto cierra el archivo, pero no lo elimina.

El nombre del archivo se puede mostrar incluso después de cerrar el archivo, pero su contenido no se puede cargar.

Leer o escribir en un archivo temporal cerrado en Python da como resultado un error de valor, igual que cualquier archivo normal.

import tempfile

filepath = tempfile.TemporaryFile(
    mode="w+b",
    prefix="st.",  # adds prefix to file name
    suffix="loraine",  # adds a suffix to file name
)

filepath.write(b"Hello world!")

filepath.close()

print(filepath.name)

filepath.write(b"Hello world!")

Producción :

"C:\Users\Win 10\venv\Scripts\python.exe" "C:/Users/Win 10/main.py"
C:\Users\WIN10~1\AppData\Local\Temp\st.f7n0s5a6loraine
Traceback (most recent call last):
  File "C:/Users/Win 10/main.py", line 14, in <module>
    filepath.write(b'Hello world!')
  File "C:\Python36\lib\tempfile.py", line 485, in func_wrapper
    return func(*args, **kwargs)
ValueError: write to closed file

Process finished with exit code 1

Crear un archivo temporal con nombre en Python

La única diferencia entre esta función y TemporaryFile() es que ésta asegura que el archivo tenga un nombre visible en el sistema de archivos. Este nombre se puede encontrar en el atributo nombre cuando se devuelve el objeto.

En UNIX, se puede usar el mismo nombre para abrir otro archivo temporal incluso si el archivo anterior ya está abierto, pero está prohibido en Windows.

De forma predeterminada, el archivo temporal en Python está configurado para eliminarse tan pronto como se cierre, pero se puede desactivar configurando delete = False. Similar a un archivo regular, este objeto similar a un archivo se puede usar en una declaración.

La sintaxis para usar esta subfunción es:

tmp = tempfile.NamedTemporaryFile()
# 	OR
tmp = tempfile.NamedTemporaryFile(mode="w+b", delete=False, suffix=None, prefix=None)

Para crear un archivo temporal con nombre en Python, use el siguiente programa.

Este programa importa dos paquetes de biblioteca aquí, os y tempfile. Se crea un archivo temporal utilizando la variable tempo_file, el parámetro delete se establece en False, y se proporciona un prefijo y un sufijo.

Dentro del bloque try, el objeto del archivo se imprime usando print(tempo_file). Luego, el nombre del archivo se imprime usando print(tempo_file.name).

La función tempo_file.write() se utiliza para escribir dentro de este archivo temporal.

Dentro del bloque finally, el archivo se cierra usando tempo_file.close(). Luego, usando la función os.unlink(), el nombre del archivo se desvincula del objeto del archivo.

import os
import tempfile

tempo_file = tempfile.NamedTemporaryFile(delete=False, prefix="Ice", suffix="cream")
try:
    print(tempo_file)
    print(tempo_file.name)
    tempo_file.write(b"Peacock is national bird of India")
finally:
    tempo_file.close()
    os.unlink(tempo_file.name)

Producción :

"C:\Users\Win 10\venv\Scripts\python.exe" "C:/Users/Win 10/main.py"
<tempfile._TemporaryFileWrapper object at 0x000001DE90935C18>
C:\Users\WIN10~1\AppData\Local\Temp\Icez5eghui0cream

Process finished with exit code 0

El parámetro eliminar se convierte en False en el programa anterior, lo que significa que si no está cerrado implícitamente, permanece abierto. Si el parámetro eliminar se establece en True, no se podrá acceder al nombre del archivo después de cerrar el archivo.

import os
import tempfile

tempo_file = tempfile.NamedTemporaryFile(delete=True)
try:
    print(tempo_file.name)
finally:
    tempo_file.close()
    os.unlink(tempo_file.name)

print(tempo_file.name)

Producción :

"C:\Users\Win 10\venv\Scripts\python.exe" "C:/Users/Win 10/ain.py"
C:\Users\WIN10~1\AppData\Local\Temp\tmp6j3xxjzr
Traceback (most recent call last):
  File "C:/Users/Win 10/main.py", line 14, in <module>
    os.unlink(tempo_file.name)
FileNotFoundError: [WinError 2] The system cannot find the file specified:'C:\\Users\\WIN10~1\\AppData\\Local\\Temp\\tmp6j3xxjzr'

Process finished with exit code 1

Un bloque con es útil ya que cierra automáticamente el archivo.

import tempfile

with tempfile.TemporaryFile(delete=True) as tempo_file:
    print(tempo_file)
    print(tempo_file.name)
    tempo_file.write(b"Peacock is national bird of India")

print(tempo_file.read())

Producción :

"C:\Users\Win 10\venv\Scripts\python.exe" "C:/Users/Win 10/main.py"
<tempfile._TemporaryFileWrapper object at 0x0000027EB1C09390>
C:\Users\WIN10~1\AppData\Local\Temp\tmpzk_gpkau
Traceback (most recent call last):
  File "C:/Users/Win 10/main.py", line 11, in <module>
    print(tempo_file.read())
  File "C:\Python36\lib\tempfile.py", line 485, in func_wrapper
    return func(*args, **kwargs)
ValueError: read of closed file

Process finished with exit code 1

Crear archivo temporal en Python usando la función mkstemp

Esta función proporciona el mayor nivel de seguridad posible para crear un archivo temporal en Python. Solo el ID de usuario que creó el archivo tiene acceso para leerlo y escribirlo.

Nadie puede ejecutar el archivo si la plataforma emplea bits de permiso para determinar si un archivo es ejecutable. Incluso los procesos secundarios no heredan el descriptor de archivo.

La sintaxis utilizada para mkstemp es:

tempfile.mkstemp(suffix=None, prefix=None, dir=None, text=False)

A diferencia de la función TemporaryFile(), el programador debe borrar implícitamente el archivo temporal cuando se utiliza mkstemp(). La función tiene roles únicos para los parámetros prefijo, sufijo y dir.

Mirémoslos.

El nombre del archivo terminará con un sufijo determinado si no está configurado como Ninguno; de lo contrario, no habrá uno. Se debe colocar un punto al comienzo del sufijo si es necesario porque mkstemp() no coloca uno entre el nombre del archivo y el sufijo.

El nombre del archivo comenzará con un prefijo si lo hay en lugar de Ninguno; de lo contrario, se utiliza un prefijo predeterminado. El valor devuelto por gettempprefix() o gettempprefixb() sirve como predeterminado, cualquiera que sea el programa que parezca adecuado.

El dir almacena el directorio del archivo temporal. Se creará un archivo en un directorio determinado si dir no está configurado como Ninguno; de lo contrario, se utiliza un directorio predeterminado.

El directorio predeterminado depende de la plataforma.

Al modificar las variables de entorno TMPDIR, TEMP o TMP, el usuario de la aplicación puede anular la selección del directorio predeterminado de esa lista específica de la plataforma.

sufijo, prefijo y dir deben tener todos el mismo tipo si no están configurados en Ninguno. Si son bytes, el nombre devuelto será bytes en lugar de str.

Pasar suffix=b forzará bytes en el valor de retorno en lugar de su comportamiento predeterminado.

El archivo se abre en modo texto si el texto se especifica y es True. Si se establece en False, el sistema abre el archivo en modo binario por defecto.

El siguiente programa crea un archivo temporal usando mkstemp. La función mkstemp utiliza dos argumentos, el primero es el identificador del archivo y el segundo es el nombre del archivo.

Dentro de un bloque try, el archivo se abre usando un bloque with a través de su identificador. Luego, algunos datos se escriben dentro del archivo.

Dentro del bloque finally, el archivo se elimina implícitamente utilizando os.unlink(filename).

import os
import tempfile

handle, filename = tempfile.mkstemp(suffix=".bat")
try:
    with os.fdopen(handle, "w") as f:
        f.write("signature")
        print(handle)
        print(filename)

finally:
    os.unlink(filename)

Producción :

"C:\Users\Win 10\venv\Scripts\python.exe" "C:/Users/Win 10/main.py"
3
C:\Users\WIN10~1\AppData\Local\Temp\tmp1yvy9j_c.bat

Process finished with exit code 0

Crear un directorio temporal en Python

Esta clase crea un directorio temporal de forma segura. Estos objetos se pueden usar usando un administrador de contexto como el bloque with.

Los directorios temporales recién formados y su contenido se eliminan de la memoria al finalizar el contexto o al destruirse el objeto del directorio temporal.

El atributo nombre del objeto devuelto contiene el nombre del directorio, que se puede obtener. Este nombre se le da al objetivo de la cláusula as en la declaración with (si hay una) cuando el objeto devuelto se usa como administrador de contexto.

Por ejemplo:

with tempfile.TemporaryDirectory() as f:  # 'f' is the 'as' clause in this while statement
    print("Temporary directory is created", f)

Llamar al método cleanup() borrará explícitamente el directorio. Cualquier excepción no controlada durante la limpieza explícita o implícita se ignorará si “ignorar errores de limpieza” es verdadero.

Todos los elementos removibles restantes se destruirán utilizando las técnicas Best-Effort.

Para crear un directorio temporal, podemos usar el siguiente programa de Python:

import tempfile

with tempfile.TemporaryDirectory() as f:
    print("Temporary directory is created", f)

Producción :

"C:\Users\Win 10\venv\Scripts\python.exe" "C:/Users/Win 10/main.py"
Temporary directory is created C:\Users\WIN10~1\AppData\Local\Temp\tmp1gk3c5z8

Process finished with exit code 0

Este artículo ha explicado métodos para crear archivos temporales usando el módulo tempfile en Python y sus subfunciones.

Artículo relacionado - Python File