Blog
Operaciones con archivos y carpetas
- Publicado por: Rafael Fernandez
- Categoría: Blog

Los ficheros (carpetas o archivos) siempre están presentes en todo tipo de sistemas, ya sea servidores, moviles, tablets o computadoras. Aprender a manejar ficheros con Python es muy fácil gracias a la gran mayoría de librerías que este nos provee ya que es muy fácil crear, eliminar, mover o copiar un fichero. Incluso podemos hacer programas de automatización de tareas con Python.
Un ejemplo muy simple sería un limpiador de archivos temporales, esos archivos que en algún momento debemos borrar para realizarle una limpieza a nuestro dispositivo. En el más profesional de los casos lo más complicado sería un Antivirus, estos también utilizan operaciones con archivos y carpetas cuando realizan sus análisis.
En primera instancia podemos comenzar conociendo los 2 módulos que nos permiten hacer este tipo de operaciones en Python, el primer módulo se llama OS
y el segundo módulo se llama shutil
.
El módulo os es un modulo que nos permite realizar operaciones directamente con el sistema operativo, ya sea Windows, Linux o MAC.
Antes de comenzar a trabajar con los ficheros, debemos primero aprender algunas de las funciones básicas de los ficheros, para ello crearemos una carpeta llamada “Ficheros” en el escritorio de nuestra computadora y dentro de ella un archivo llamado básico.py
y también crearemos una carpeta llamada “src”.
Saber si el directorio es archivo o carpeta
Para saber si un directorio existe se utiliza la función .isdir() del módulo os
import os es_carpeta = os.path.isdir('src') print(es_carpeta) es_carpeta_2 = os.path.isdir('basico.py') print(es_carpeta_2) # >>> Al ejecutar obtenemos el siguiente resultado: # True # False
El primer resultado devuelve True porque el directorio es una carpeta, mientras que el segundo devuelve False porque el directorio no es una carpeta, por ahora agreguemos más código a nuestro archivo básico.py
Saber si el directorio o archivo existe
Para saber si un directorio existe o no, debemos usar os.path.exists()
existe_directorio_archivo = os.path.exists('src') print(existe_directorio_archivo) existe_directorio_archivo_2 = os.path.exists('basico.py') print(existe_directorio_archivo_2) # >>> Al ejecutar obtenemos el siguiente resultado: # True # True
El primer resultado devuelve True porque el directorio existe, mientras que el segundo devuelve True porque el archivo existe.
Saber si es un archivo o directorio
Para cumplir con esto, solo debemos usar os.path.isfile() para saber si es un archivo y os.path.isdir() para saber si es un directorio
es_archivo = os.path.isfile('src') es_directorio = os.path.isdir('basico.py') print(es_archivo) print(es_directorio) # >>> Al ejecutar obtenemos el siguiente resultado: # False # False
Obtenemos False en ambos resultados porque al preguntar si “src” es un archivo obtenemos False puesto que este es una carpeta y en segunda instancia “basico.py” al preguntar si es una carpeta obtenemos False porque es un archivo.
Uniendo directorios para crear rutas
En Python podemos unir rutas hacia directorios para guardarlos en alguna variables y utilizarlos más fácilmente, esto lo podemos lograr utilizando la función .join() de la siguiente manera.
# Nuestro directorio de Trabajo actual es C:/Users/USER/Desktop/Ficheros DIRECTORIO_BASE = "C:/Users/USER/Desktop/Ficheros" # Dentro de este directorio hay carpeta llamada "src" que creamos anteriormente, entonces necesitamos unirla a la ruta base para obtener la ruta completa a esta carpeta src DIRECTORIO_SRC = os.path.join(DIRECTORIO_BASE, 'src') print(DIRECTORIO_SRC) # >>> Al ejecutar obtenemos el siguiente resultado: C:/Users/USER/Desktop/Ficheros/src
Como podemos ver, hemos unido una ruta para crear una ruta totalmente nueva a otra carpeta.
Listando ficheros de un directorio
Dentro de la carpeta “Ficheros” crearemos un archivo llamado ficheros.py
y una carpeta llamada “test”. Ahora escribiremos un par de líneas de código en este archivo para que busque dicha carpeta “Test” y luego liste todo lo que contiene esa carpeta. En la carpeta “test” podemos colocar cualquier archivo o fichero en mi caso colocaré 3 imágenes, al momento en que ejecutemos el código Python debería decirnos lo que contiene.
import os # Lo primero es pasar la ruta donde se encuentra ubicada nuestra carpeta a analizar, esto lo podemos lograr guardando un directorio base dentro de una variable DIRECTORIO_BASE = os.path.dirname(__file__) # El método .dirname nos dice el nombre de la carpeta en el que se encuentra un archivo y al pasarle la variable de Python llamada __file__ indica a Python que es el archivo sobre el cual estamos trabajando y queremos saber el nombre de la carpeta en el cual se encuentra. # >>> Al ejecutar obtenemos el siguiente resultado: C:\Users\USER\Desktop\Ficheros # Ahora debemos unir este durectirio con la carpeta que necesitamos analizar, la cual se encuentra dentro de este directorio DIRECTORIO_ANALIZAR = os.path.join(DIRECTORIO_BASE, 'test') # >>> Al ejecutar obtenemos el siguiente resultado: C:\Users\USER\Desktop\Ficheros\test # Este será la ruta de nuestra carpeta a analizar, ahora procedemos a escribir la última linea de este script DIRECTORIO_ANALIZADO = os.listdir(DIRECTORIO_ANALIZAR) print(DIRECTORIO_ANALIZADO) # >>> Al ejecutar obtenemos el siguiente resultado: ['Logo Django.jpg', 'Logo Flask.png', 'Logo Python.jpg']
Como ves, este código nos dice lo que hay dentro de esta carpeta sean archivos o carpetas (en este caso solo archivos de imágenes) y es una operación bastante sencilla pero útil a la hora de utilizar archivos con Python, vamos a continuar trabajando con este mismo archivo agregándole más código para ver otros ejemplos.
Obtener directorio de trabajo
En el código anterior obtuvimos el directorio de trabajo con DIRECTORIO_BASE = os.path.dirname(__file__)
pero en python hay una manera más fácil de obtener el directorio base o de trabajo, vamos a agregar la siguiente linea a nuestro código:
DIRECTORIO_BASE_2 = os.getcwd() print(DIRECTORIO_BASE_2) # >>> Al ejecutar obtenémos el siguiente resultado: C:\Users\USER\Desktop\Ficheros
la función .getcwd() obtiene el directorio actual de trabajo del archivo lo cuál prácticamente es lo mismo que hicimos con DIRECTORIO_BASE = os.path.dirname(__file__)
podemos compararlos de la siguiente manera:
print('Directorio base o de trabajo con os.dirname(__file__):', DIRECTORIO_BASE) print('Directorio base o de trabajo con os.getcwd():', DIRECTORIO_BASE_2) # >>> Al ejecutar obtenémos los siguientes resultados: # Directorio base o de trabajo con os.dirname(__file__): C:\Users\USER\Desktop\Ficheros # Directorio base o de trabajo con os.getcwd(): C:\Users\USER\Desktop\Ficheros
Podemos observar que si agregamos estas líneas de código a nuestro archivo y lo ejecutamos, entonces los resultados serán los mismos.
Por otro lado, existe otra función similar a .getcwd() la cual se llama .getcwdb() esta función lo que hace es prácticamente lo mismo que la anterior, que es devolver el directorio base o de trabajo pero en formato unicode.
DIRECTORIO_BASE_3 = os.getcwdb() print(DIRECTORIO_BASE_3) #>>> Al ejecutar obtenemos los siguientes resultados: b'C:\\Users\\USER\\Desktop\\Ficheros'
Esto es muy útil cuando necesitamos pasar directorios en formato unicode a ciertas funciones.
Crear y eliminar directorios
En este punto comenzaremos a crear y eliminar directorios, para ello tendremos que utilizar las funciones .mkdir
y .makedirs
para crear directorios y .rmdir
y .removedirs
para eliminar directorios.
Ahora escribiremos código que haga uso de las funciones para crear directorios y veamos como funcionan:
# Podemos utilizar la función .mkdir solo pasando el nombre de la carpeta o directorio que queremos crear, pero este se creará en el directorio base o de trabajo os.mkdir('api') print('Se ha creado una carpeta llamada "api" dentro de la carpeta "Ficheros"') # Pero también podemos indicarle que lo haga en otro lugar pasando la ruta de un directorio en concreto, para este caso le diré que lo cree dentro de la subcarpeta test print('Se ha creado una carpeta llamada "api" dentro de la subcarpeta "test"') os.mkdir('test/api') # Podemos crear una carpeta con varias subcarpetas os.makedirs('productos/teléfonos/android') print('Se ha creado una subcarpeta llamada "productos" y dentro de productos la subcarpeta "teléfonos" y dentro de teléfonos la subcarpeta "android"') # >>> Al ejecutar obtenemos los siguientes resultados # Se ha creado una carpeta llamada "api" dentro de la carpeta ficheros # Se ha creado una carpeta llamada "api" dentro de la subcarpeta test # Se ha creado una subcarpeta llamada "productos" y dentro de productos la subcarpeta "teléfonos" y dentro de teléfonos la subcarpeta "android"
Podemos comprobar lo que se ha creado en estas carpetas utilizando el código que vimos anteriormente para listar los directorios, para este caso tendríamos que listar el directorio “Ficheros” y su subcarpeta “test”
# Listamos el directorio base o de trabajo DIRECTORIO_ANALIZADO_2 = os.listdir(DIRECTORIO_BASE) print('Analizando directorio "Ficheros":', DIRECTORIO_ANALIZADO_2) # Para analizar la subcarpeta, unimos el directorio base con el nombre de la subcarpeta como lo hicimos anteriormente DIRECTORIO_ANALIZADO_3 = os.listdir(os.path.join(DIRECTORIO_BASE, 'test')) print('Analizando subcarpeta "test" de la carpeta "Ficheros":', DIRECTORIO_ANALIZADO_3) # >>> Al ejecutar obtenemos los siguientes resultados: # Analizando directorio "Ficheros": ['api', 'ficheros.py', 'test'] # Analizando subcarpeta "test" de la carpeta "Ficheros": ['api', 'Logo Django.jpg', 'Logo Flask.png', 'Logo Python.jpg']
Nos podemos fijar que la subcarpeta “test” ha cambiado desde la última vez que se analizó al principio de este artículo y es que ahora aparece el nombre de una carpeta llamada api que creamos en el código anterior, seguida de las 3 imágenes que estaban anteriormente.
Ahora para eliminar estas carpetas y subcarpetas que hemos creado podemos hacerlo con las funciones que nombramos anteriormente, entonces:
os.rmdir('api') print('Carpeta "api" eliminada') os.removedirs('productos/teléfonos/android') print('Carpeta productos y subcarpetas eliminadas')
Ahora al igual como pasó anteriormente con el directorio base o de trabajo que podía obtenerse de una manera más simple, lo mismo pasa cuando queremos eliminar una carpeta con subcarpetas o simplemente una carpeta con archivo o que no esté vacía en general, para ello podemos utilizar el modulo shutil y utilizar su funcion .rmtree. ¿Pero por qué shutil y no usar directamente os.removedirs()?, bueno veamos el porqué creando una subcarpeta en la carpeta Ficheros llamada diseños y dentro de esta otra una subcarpeta llamada vectores y ejecutemos el siguiente código:
# Intentemos eliminar la carpeta "diseños" os.removedirs('diseños') # >>> Al ejecutar obtenemos el siguiente resultado: OSError: [WinError 145] El directorio no está vacío: 'diseños'
Como puedes observar obtenemos el error de que no está vacía la carpeta, entonces tendríamos que pasarle el nombre de las subcarpetas a .removedirs como lo hicimos anteriormente, pero imagina tener muchas subcarpetas y dentro de esas subcarpetas muchos otros archivos, hacer esto te llevaría demasiado tiempo y aquí entra la importancia de shutil, que con tan solo una linea de código puedes deshacerte de todo.
import shutil shutil.rmtree('diseños')
Con ese simple código se eliminará toda la carpeta diseño y sus subcarpetas, sin importar si están o no vacías.
Eliminar archivo
Hemos concretado la eliminación de carpetas pero no de archivos, esto lo podemos hacer simplemente con la función os.remove(‘Nombre de archivo’) pero para que esto funcione el archivo debe estar dentro de el directorio base o de trabajo, de lo contrario debes pasar la ruta completa del archivo.
Copiando archivos
Vamos a crear un archivo dentro de la carpeta “Ficheros”, llamemos este archivo credenciales.txt y vamos a copiarlo con la ayuda de shutil.
# Si lo queremos en el mismo directorio shutil.copy('credenciales.txt', 'credenciales_copia.txt') # Si lo queremos en otro directorio shutil.copy('credenciales.txt', 'test/credenciales_copia.txt') # >>> Al ejecutar este código obtenemos una copia del archivo credenciales.txt llamado credenciales_copia.txt
Existe otra manera de copiar archivos con shutil, este consiste en hacerlo con la función .copy2. Esta función lo que hace es copiar igualmente el archivo pero con todos sus metadatos, como hora de creación, fecha o modificación.
# Si lo queremos en el mismo directorio shutil.copy2('credenciales.txt', 'credenciales_copia.txt') # Si lo queremos en otro directorio shutil.copy2('credenciales.txt', 'test/credenciales_copia.txt') # >>> Al ejecutar este código obtenemos una copia del archivo credenciales.txt llamado credenciales_copia.txt con todos sus metadatos.
Copiando carpetas
Ahora para copiar una carpeta con todos sus archivos y subcarpetas solo debemos utilizar la función shutil.copytree()
# Si lo queremos en el mismo directorio shutil.copytree('test', 'test_copia') # Si lo queremos en otro directorio shutil.copytree('test', 'copias/test_copia')
Moviendo carpetas
Para mover una carpeta basta con llamar a la función shutil.move() le pasamos como argumentos el nombre o ruta de la carpeta y como segundo argumento hacían donde lo queremos mover, para este ejemplo crearé una subcarpeta llamada “información” dentro de la carpeta “Ficheros” y la moveré dentro de la carpeta “test”.
shutil.move('información', 'test')
Con esta línea de código se moverá la carpeta información dentro de la carpeta test.
Renombrando archivos o carpetas
Para renombrar ya sea un archivo o una carpeta, podemos utilizar la función .rename del módulo os.
# En un archivo os.rename('credenciales.txt', 'credentials.txt') # En una carpeta os.rename('test', 'prueba')
Con esto ya habremos renombrado la carpeta o el archivo que deseemos.