El módulo de archivo temporal de Python

Los archivos temporales, o tempfiles, se utilizan principalmente para almacenar información intermedia en el disco para una aplicación. Estos archivos se crean normalmente para d ...

Introducción

Los archivos temporales, o "tempfiles", se utilizan principalmente para almacenar información intermedia en el disco para una aplicación. Estos archivos normalmente se crean para diferentes propósitos, como una copia de seguridad temporal o si la aplicación está tratando con un gran conjunto de datos más grande que la memoria del sistema, etc. Idealmente, estos archivos se ubican en un directorio separado, que varía en diferentes sistemas operativos. , y el nombre de estos archivos son únicos. Los datos almacenados en archivos temporales no siempre son necesarios después de que se cierra la aplicación, por lo que es posible que desee que estos archivos se eliminen después de su uso.

Python proporciona un módulo conocido como archivo temporal, que facilita la creación y el manejo de archivos temporales. Este módulo proporciona algunos métodos para crear archivos y directorios temporales de diferentes maneras. tempfile es útil siempre que desee utilizar archivos temporales para almacenar datos en un programa de Python. Echemos un vistazo a un par de ejemplos diferentes sobre cómo se puede usar el módulo tempfile.

Creación de un archivo temporal

Suponga que su aplicación necesita un archivo temporal para usar dentro del programa, es decir, creará un archivo, lo usará para almacenar algunos datos y luego lo eliminará después de usarlo. Para lograr esto, podemos usar la función TemporaryFile().

Esta función creará un archivo temporal en la ubicación predeterminada de tempfile. Esta ubicación puede ser diferente entre los sistemas operativos. La mejor parte es que el archivo temporal creado por TemporaryFile() se eliminará automáticamente cada vez que se cierre el archivo. Además, no crea ninguna referencia a este archivo en la tabla del sistema de archivos del sistema. Esto lo hace privado para la aplicación actual, es decir, ningún otro programa podrá abrir el archivo.

Echemos un vistazo al siguiente programa de Python para ver cómo funciona:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
import tempfile #1

print("Creating one temporary file...")

temp = tempfile.TemporaryFile() #2

try:
    print("Created file is:", temp) #3
    print("Name of the file is:", temp.name) #4
finally:
    print("Closing the temp file")
    temp.close() #5

Imprimirá el siguiente resultado:

1
2
3
4
5
$ python3 temp-file.py
Creating one temporary file...
Created file is: <_io.BufferedRandom name=4>
Name of the file is: 4
Closing the temp file
  1. Para crear un archivo temporal en Python, debe importar el módulo tempfile.
  2. Como se explicó anteriormente, hemos creado el archivo temporal usando la función TemporaryFile().
  3. A partir de la salida, puede ver que el objeto creado en realidad no es un archivo, es un objeto similar a un archivo. Y, el parámetro modo (que no se muestra en nuestro ejemplo) del archivo creado es w+b, es decir, puede leer y escribir sin estar cerrado.
  4. El archivo temporal creado no tiene nombre.
  5. Finalmente, estamos cerrando el archivo usando el método close(). Será destruido después de que se cierre.

Una cosa que debemos señalar es que el archivo creado con la función TemporaryFile() puede o no tener un nombre visible en el sistema de archivos. En Unix, la entrada de directorio del archivo se elimina automáticamente después de crearlo, aunque esto no es compatible con otras plataformas. Normalmente TemporaryFile() es la forma ideal de crear un área de almacenamiento temporal para cualquier programa en Python.

Crear un archivo temporal con nombre

En nuestro ejemplo anterior, hemos visto que el archivo temporal creado con la función TemporaryFile() es en realidad un objeto similar a un archivo sin un nombre de archivo real. Python también proporciona un método diferente, NamedTemporaryFile(), para crear un archivo con un nombre visible en el sistema de archivos. Además de proporcionar un nombre al archivo temporal, NamedTemporaryFile() funciona igual que TemporaryFile(). Ahora usemos el mismo ejemplo anterior para crear un archivo temporal con nombre:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
import tempfile

print("Creating one named temporary file...")

temp = tempfile.NamedTemporaryFile()

try:
    print("Created file is:", temp)
    print("Name of the file is:", temp.name)
finally:
    print("Closing the temp file")
    temp.close()

Ejecutar este código imprimirá un resultado similar al siguiente:

1
2
3
4
5
$ python3 named-temp-file.py
Creating one named temporary file...
Created file is: <tempfile._TemporaryFileWrapper object at 0x103f22ba8>
Name of the file is: /var/folders/l7/80bx27yx3hx_0_p1_qtjyyd40000gn/T/tmpa3rq8lon
Closing the temp file

Entonces, el archivo creado en realidad tiene un nombre esta vez. La ventaja de NamedTemporaryFile() es que podemos guardar el nombre de los archivos temporales creados y usarlos más tarde antes de cerrarlos o destruirlos. Si el parámetro delete se establece en False, entonces podemos cerrar el archivo sin que se destruya, permitiéndonos volver a abrirlo más tarde.

Proporcionar un sufijo o prefijo al nombre

A veces necesitamos agregar un prefijo o sufijo al nombre de un archivo temporal. Nos ayudará a identificar todos los archivos temporales creados por nuestro programa.

Para lograr esto, podemos usar la misma función NamedTemporaryFile definida anteriormente. Lo único que necesitamos agregar son dos parámetros adicionales al llamar a esta función: sufijo y prefijo

1
2
3
4
5
6
7
8
9
import tempfile

temp = tempfile.NamedTemporaryFile(prefix="dummyPrefix_", suffix="_dummySuffix")

try:
    print("Created file is:", temp)
    print("Name of the file is:", temp.name)
finally:
    temp.close()

Ejecutar este código imprimirá el siguiente resultado:

1
2
3
$ python3 prefix-suffix-temp-file.py
Created file is: <tempfile._TemporaryFileWrapper object at 0x102183470>
Name of the file is: /var/folders/tp/pn3dvz_n7cj7nfs0y2szsk9h0000gn/T/dummyPrefix_uz63brcp_dummySuffix

Por lo tanto, si pasamos los dos argumentos adicionales sufijo y prefijo a la función NamedTemporaryFile(), los agregará automáticamente al principio y al final del nombre del archivo.

Encontrar la ubicación predeterminada de los archivos temporales {#encontrar la ubicación predeterminada de los archivos temporales}

La variable tempfile.tempdir contiene la ubicación predeterminada para todos los archivos temporales. Si el valor de tempdir es Ninguno o no está configurado, Python buscará en una lista estándar de directorios y establecerá tempdir en el primer valor de directorio, pero solo si el programa que llama puede crear un archivo en él. La siguiente es la lista de directorios que escaneará, en este orden:

  1. El directorio nombrado por la variable de entorno TMPDIR.
  2. El directorio nombrado por la variable de entorno TEMP.
  3. El directorio nombrado por la variable de entorno TMP
  4. Directorios específicos de la plataforma:
    1. On windows, C:\TEMP, C:\TMP, \TEMP, and \TMP, in the same order.
    2. On other platforms, /tmp, /var/tmp, and /usr/tmp, in the same order.
  5. El directorio de trabajo actual.

Para averiguar la ubicación predeterminada de los archivos temporales, podemos llamar al método tempfile.gettempdir(). Devolverá el valor de tempdir si no es Ninguno. De lo contrario, primero buscará la ubicación del directorio siguiendo los pasos mencionados anteriormente y luego devolverá la ubicación.

1
2
3
4
5
6
7
import tempfile

print("Current temp directory:", tempfile.gettempdir())

tempfile.tempdir = "/temp"

print("Temp directory after change:", tempfile.gettempdir())

Si ejecuta el programa anterior, imprimirá un resultado similar al siguiente:

1
2
3
$ python3 dir-loc-temp-file.py
Current temp directory: /var/folders/tp/pn3dvz_n7cj7nfs0y2szsk9h0000gn/T
Temp directory after change: /temp

Puede ver que la ubicación del primer directorio temporal es la ubicación del directorio proporcionada por el sistema y que el segundo directorio temporal tiene el mismo valor que el que hemos definido.

Lectura y escritura de datos de archivos temporales {#lectura y escritura de datos de archivos temporales}

Hemos aprendido cómo crear un archivo temporal, crear un archivo temporal con un nombre y cómo crear un archivo temporal con un sufijo y/o prefijo. Ahora, intentemos entender cómo leer y escribir datos de un archivo temporal en Python.

Leer y escribir datos de un archivo temporal en Python es bastante sencillo. Para escribir, puede usar el método write() y para leer, puede usar el método read(). Por ejemplo:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
import tempfile

temp = tempfile.TemporaryFile()

try:
    temp.write(b'Hello world!')
    temp.seek(0)

    print(temp.read())
finally:
    temp.close()

Esto imprimirá la salida como b'Hello world!' ya que el método write() toma los datos de entrada en bytes (de ahí el prefijo b en la cadena).

Si desea escribir datos de texto en un archivo temporal, puede usar el método writelines() en su lugar. Para usar este método, necesitamos crear el archivo temporal usando el modo w+t en lugar del modo predeterminado w+b. Para hacer esto, se puede pasar un parámetro modo a TemporaryFile() para cambiar el modo del archivo temporal creado.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
import tempfile

temp = tempfile.TemporaryFile(mode='w+t')

try:
    temp.writelines("Hello world!")
    temp.seek(0)

    print(temp.read())
finally:
    temp.close()

A diferencia del ejemplo anterior, esto imprimirá "Hello World" como salida.

Crear un directorio temporal

Si su programa tiene varios archivos temporales, puede ser más conveniente crear un directorio temporal y colocar todos sus archivos temporales dentro de él. Para crear un directorio temporal, podemos usar la función TemporaryDirectory(). Después de cerrar todos los archivos temporales, debemos eliminar el directorio manualmente.

1
2
3
4
5
6
import tempfile

with tempfile.TemporaryDirectory() as tmpdirname:
    print('Created temporary directory:', tmpdirname)

# Both the directory and its contents have been deleted

Imprimirá el siguiente resultado:

1
2
$ python3 mk-dir-temp-file.py
Created temporary directory: /var/folders/l7/80bx27yx3hx_0_p1_qtjyyd40000gn/T/tmpn_ke7_rk

Crear un archivo y directorio temporal seguro

Usando mkstemp(), podemos crear un archivo temporal de la manera más segura posible. El archivo temporal creado con este método solo puede leerlo y escribirlo el ID de usuario que lo crea. Podemos pasar los argumentos prefijo y sufijo para agregar prefijo y sufijo al nombre del archivo creado. Por defecto, abre el archivo en modo binario. Para abrirlo en modo texto, podemos pasar text=True como argumento a la función. A diferencia de TemporaryFile(), el archivo creado por mkstemp() no se elimina automáticamente después de cerrarlo.

Como puede ver en el ejemplo a continuación, el usuario es responsable de eliminar el archivo.

1
2
3
4
5
6
7
8
import tempfile
import os

temp_directory = tempfile.TemporaryDirectory()

print("Directory name:", temp_directory)

os.removedirs(temp_directory)
1
2
$ python3 mk-secure-dir-temp-file.py
Directory name: /var/folders/tp/pn3dvz_n7cj7nfs0y2szsk9h0000gn/T/tmpf8f6xc53

Similar a mkstemp(), podemos crear un directorio temporal de la manera más segura posible utilizando el método mkdtemp(). Y nuevamente, como mkstemp(), también admite argumentos prefix y suffix para agregar un prefijo y un sufijo al nombre del directorio.

Conclusión

En este artículo hemos aprendido diferentes formas de crear archivos y directorios temporales en Python. Puede usar archivos temporales en cualquier programa de Python que desee. Pero solo asegúrese de eliminarlo si el método particular utilizado no lo elimina automáticamente por sí solo. También tenga en cuenta que el comportamiento puede diferir entre los sistemas operativos, como los nombres de los directorios de salida y los nombres de los archivos.

Todas estas funciones que hemos explicado anteriormente funcionan con muchos argumentos diferentes, aunque no hemos cubierto en detalle qué tipo de argumentos toma cada función. Si desea obtener más información sobre el módulo tempfile, debe consultar la [documentación oficial] de Python 3 (https://docs.python.org/3/library/tempfile.html).

Licensed under CC BY-NC-SA 4.0