Crear y eliminar directorios con Python

Este artículo continúa con nuestra serie sobre la interacción con el sistema de archivos en Python. Los artículos anteriores trataron sobre la lectura y escritura de archivos. Curiosamente,...

Este artículo continúa con nuestra serie sobre la interacción con el sistema de archivos en Python. Los artículos anteriores trataban de archivos lectura y escritura. Curiosamente, el sistema de archivos es mucho más que una forma de almacenar/recuperar datos en el disco. También hay varios otros tipos de entradas, como archivos, directorios, sockets (para la comunicación entre procesos), canalizaciones con nombre, enlaces suaves y duros, así como archivos especiales (dispositivos de bloque). Leer y escribir desde y hacia ellos se hace de forma similar a como vimos en los artículos anteriores.

Este artículo se centra en el manejo de directorios. Otros sistemas operativos, como UNIX/Linux, utilizan una terminología diferente, donde una "entrada" se denomina "carpeta". A continuación, le mostraremos cómo identificar el directorio de trabajo actual, cómo crear un directorio único persistente y temporal, así como estructuras de directorio anidadas con subcarpetas, y cómo eliminar un directorio si ya no es necesario. Por lo tanto, entran en juego los dos módulos de Python os y tempfile.

Módulos de Python requeridos

Leer y escribir archivos no requiere cargar un módulo adicional, pero acceder a las funciones del sistema de archivos (como manejar directorios) requiere que usemos un módulo separado. Primero, se debe cargar el módulo os. os es un módulo de Python que pertenece a la parte central del ecosistema de Python. Se hace usando una declaración de importación de la siguiente manera:

1
import os

El módulo os contiene la mayoría de los métodos que necesitaremos a lo largo de este artículo. Sin embargo, como verá más adelante, si desea algo más avanzado, como crear un archivo temporal para almacenar datos, también necesitaremos el módulo tempfile.

Detección del directorio de trabajo actual

Antes de comenzar con la creación/eliminación de directorios, veamos cómo realizar otras operaciones básicas de directorio, como detectar el directorio de trabajo actual usando el método getcwd(). Este método devolverá una cadena que contiene la ruta de su directorio de trabajo. Listado 1 muestra cómo integrar este método en un script de Python.

1
2
3
4
5
6
# import the os module
import os

# detect the current working directory and print it
path = os.getcwd()
print ("The current working directory is %s" % path)

Listado 1

La salida debería ser algo como esto:

1
2
$ python3 cwd.py
The current working directory is /home/frank/

Además, el módulo os contiene el método adicional getcwdb(). Este es similar al método getcwd() pero en su lugar devuelve la ruta como una cadena binaria.

Hay bastantes otras operaciones de directorio que no se tratan en este artículo, como comprobar si existe un archivo o directorio. Pero por ahora vamos a pasar al objetivo principal de este artículo.

Creación de un directorio

La creación de un solo directorio se realiza mediante el método mkdir(). Como parámetro, mkdir() primero requiere el nombre de la ruta del directorio para poder crearlo. Para ver un ejemplo, vea el siguiente código:

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

# define the name of the directory to be created
path = "/tmp/year"

try:
    os.mkdir(path)
except OSError:
    print ("Creation of the directory %s failed" % path)
else:
    print ("Successfully created the directory %s " % path)

Listado 2

Tenga en cuenta que el método mkdir() no puede crear subdirectorios en un nivel más profundo que uno en una sola llamada. Para crear una ruta completa, debe llamar a mkdir() una vez por nivel de directorio. Alternativamente, si desea crear varios directorios a la vez, utilice el método makedirs() en su lugar (que puede ver en el Listado 4 a continuación).

Como parámetro opcional, puede especificar los [derechos de acceso] (https://en.wikipedia.org/wiki/File_system_permissions) al directorio dentro de su llamada mkdir(). La configuración predeterminada es 777, lo que significa que el propietario, los miembros del grupo y todos los demás usuarios también pueden leer y escribir. En caso de que necesite una configuración más restrictiva, como 755, (legible y accesible para todos los usuarios, y acceso de escritura solo para el propietario), puede llamarla de la siguiente manera:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
import os

# define the name of the directory to be created
path = "/tmp/year"

# define the access rights
access_rights = 0o755

try:
    os.mkdir(path, access_rights)
except OSError:
    print ("Creation of the directory %s failed" % path)
else:
    print ("Successfully created the directory %s" % path)

Listado 3

Una cosa a tener en cuenta sobre este código: es posible que haya notado que los derechos de acceso (755 aquí) se especifican utilizando el prefijo octal (0o), que se hace para que no necesite convertir el número a decimal primero. Dado que el sistema operativo representa los permisos de acceso como octales, así es como los representaremos aquí también.

Sin embargo, como dice la Documentación de Python, algunos sistemas ignoran el parámetro mode y deberías usar os.chmod en su lugar.

Creación de un directorio con subdirectorios {#creación de un directorio con subdirectorios}

Como ya se mencionó anteriormente, el método mkdir() nos permite crear un único directorio, únicamente. Para crear subdirectorios de varios niveles, entra en juego el método makedirs(). En realidad, makedirs() se implementa de tal manera que llama a mkdir() para crear un directorio después del siguiente.

Como parámetro makedirs() acepta la ruta completa a crear. Este método es similar al comando de UNIX/Linux mkdir -p. Listado 4 muestra un ejemplo de cómo usar este método.

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

# define the name of the directory to be created
path = "/tmp/year/month/week/day"

try:
    os.makedirs(path)
except OSError:
    print ("Creation of the directory %s failed" % path)
else:
    print ("Successfully created the directory %s" % path)

Listado 3

Creación de un directorio temporal

Hasta ahora, hemos creado entradas permanentes en el sistema de archivos. Por varias razones, como estacionar datos temporalmente, puede ser necesario tener solo un directorio temporal. El módulo tempfile contiene métodos que manejan tales casos de una manera segura y consistente.

Listado 5 muestra un ejemplo que usa el método TemporaryDirectory() en combinación con la declaración with. Después de la declaración with, el directorio temporal ya no existe porque tanto el directorio como su contenido se han eliminado por completo.

1
2
3
4
5
6
7
import tempfile

# create a temporary directory
with tempfile.TemporaryDirectory() as directory:
    print('The created temporary directory is %s' % directory)

# directory and its contents have been removed by this point

Listado 5

Listado 6 muestra el resultado del script de Python del Listado 5. Para crear archivos temporales, en sistemas UNIX/Linux se prueban los tres directorios /tmp, /var/tmp y /usr/tmp, y se toma la primera coincidencia de ellos. En este caso actual, se utiliza el directorio /tmp.

1
2
$ python3 mkdir-temporary.py
The created temporary directory is /tmp/tmpf6o0hy3c

Listado 6

Eliminación de un directorio

Eliminar un directorio es el caso opuesto de crear uno. Puedes hacerlo usando el método rmdir() del módulo os. rmdir() requiere una cadena de ruta que contenga el nombre del directorio y solo elimina la entrada más profunda en la cadena de ruta. Tenga en cuenta que esto solo funciona cuando el directorio está completamente vacío. Si no está vacío, se genera un OSError. Listado 7 muestra el código Python correspondiente.

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

# define the name of the directory to be deleted
path = "/tmp/year"

try:
    os.rmdir(path)
except OSError:
    print ("Deletion of the directory %s failed" % path)
else:
    print ("Successfully deleted the directory %s" % path)

Listado 7

En caso de que desee eliminar un árbol de directorios completo, el método rmtree() del módulo shutil lo ayudará con esa tarea.

Conclusión

Como habrás notado, manejar directorios es muy simple en Python. Solo necesita unas pocas líneas de código para crear y eliminar este tipo de entrada de archivo.

Enlaces y referencias

Agradecimientos

El autor quisiera agradecer a Zoleka Hatitongwe por su apoyo mientras preparaba el artículo.

Licensed under CC BY-NC-SA 4.0