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

Como bien sabemos, Python viene con “baterías incluidas”, esto hace referencia a la gran cantidad de módulos que vienen predeterminados en cualquier instalación de Python. Dentro de este amplio rango de módulos, podemos encontrar funciones que nos permiten realizar operaciones con archivos y carpetas en Python independientemente del sistema operativo en el que estemos trabajando, por ejemplo, funciones que nos permitan crear archivos y directorios(carpetas) solo ejecutando una línea de comando en Python. Los módulos os
y os.path
nos pueden ayudar con esta y muchas más tareas generales. Si buscamos algo más especializado en operaciones de alto nivel para el manejo de documentos y directorios podemos hacer uso del módulo shutil
. La mayoría de los programas desarrollados en Python hacen uso de estas funciones, así que es un tema que un programador de Python debe conocer.
Mostrar directorio actual en Python
Una de las funciones más comunes en este ámbito es getcwd()
(current working directory), como lo indica su nombre, esta función devuelve la ruta desde donde estamos ejecutando el script, o si estamos trabajando con el intérprete, mostrará el directorio de instalación.
>>> import os >>> os.getcwd() '/home/usuario'
>>> import os >>> os.getcwd() '/usr/bin/python'
Para versiones anteriores de Python (2.x) tenemos la función getcwdu()
(u de Unicode) que realiza la misma tarea que la anterior, solo que presenta la string en Unicode
>>> import os >>> os.getcwdu() u'/usr/bin/python'
Para la versión 3.x de Python tenemos también la función getcwdb()
que retorna la ruta como una secuencia de bytes.
Listando archivos y carpetas en el directorio de trabajo en Python
El módulo os
nos proporciona la función listdir()
que retorna una lista que contiene archivos y carpetas de una ruta determinada.
>>> os.listdir('/home/usuario') ['Documentos', 'Imágenes', 'Videos']
>>> os.listdir("C:\\") ['Archivos de programa', 'autoexec.bat', 'Boot', 'bootmgr', 'BOOTNXT', 'Documents and Settings', 'hiberfil.sys', 'MSOCache', 'pagefile.sys', 'PerfLogs', 'Program Files', 'Program Files (x86)', 'ProgramData', 'Python27', 'Python34', 'swapfile.sys', 'System Volume Information', 'Users', 'Windows']
Si has utilizado bash, sabrás que podemos utilizar '.'
(un punto) para indicar que queremos la lista de directorios y archivos de la ruta actual.
>>> os.listdir(".") ['DLLs', 'Doc', 'include', 'Lib', 'libs', 'LICENSE.txt', 'msvcr100.dll', 'NEWS.txt', 'py.exe', 'python.exe', 'python34.dll', 'pythonw.exe', 'pyw.exe', 'qt.conf', 'README.txt', 'Scripts', 'tcl', 'Tools']
Creación y eliminación de directorios en Python
Las funciones mkdir
y mkdirs
reciben como argumento una ruta (hacia un directorio que queramos crear) y crea una carpeta en esa ruta con el nombre indicado, para esto también debemos especificar permisos (si tratamos de crear carpetas en ubicaciones que lo necesiten).
>>> os.mkdir('Fotos') >>> os.mkdir('Libros/Programacion/Python') >>> os.mkdir('Lectura', 0o444) # Creamos con permiso a solo lectura
Para eliminar directorios utilizamos las funciones contrarias: rmdir()
y removedirs()
.
>>> os.remove('Fotos') >>> os.remove('Libros/Programacion/Python')
Si intentamos eliminar una carpeta que no esté vacía, estas funciones nos lanzarán la excepción OSError
. Para eliminar directorios que contengan archivos y subdirectorios debemos utilizar la función rmtree
del módulo shutil
.
>>> import shutil >>> shutil.rmtree('Python')
Cuando queremos eliminar un archivo específico tenemos que utilizar la función os.remove()
, pasando como argumento la ruta absoluta del archivo que queremos eliminar.
>>> os.remove('Texto1.txt')
Copiar, mover y renombrar archivos en Python
Para copiar archivos, el módulo shutil
nos proporciona las funciones copy
y copy2
, que reciben como argumento la ruta o nombre del archivo que queremos copiar y la ruta del archivo que será la copia.
>>> shutil.copy('LICENSIA.txt' '/home/usuario/Documentos/Licensias/LICENSIA2.txt') /home/usuario/Documentos/Licensias/LICENSIA2.txt
La función copy2
incluye además copiado de metadatos como fecha de creación, modificación, etc.
Otras funciones dentro de este módulo son: copymode()
y copystat()
que copian permisos y metadatos de un archivo a otro, respectivamente.
Si queremos copiar un directorio recursivamente, es decir, copiar todos sus archivos y subdirectorios, debemos utilizar la función shutil.copytree()
, que toma como argumentos la ruta del directorio a copiar y la ruta destino, entre otros.
>>> shutil.copytree('Herramientas', 'Herramientas-copia') 'Herramientas-copia'
La función shutil.move()
trabaja de forma similar pero moviendo un elemento a una ubicación de destino, en vez de copiarlo. Por ejemplo, el siguiente código mueve una carpeta a una ubicación superior(directorio padre) y luego la pone en su ubicación original:
>>> shutil.move('Herramientas', '../Herramientas-copia') ../Herramientas-copia >>> shutil.move('../Herramientas-copia', 'Herramientas') 'Herramientas'
Para el renombre de archivos y directorios, Python nos da la función os.rename()
:
>>> os.rename('FEATURES.txt', 'CARACTERISTICAS.txt') >>> os.rename('CARACTERISTICAS.txt', 'FEATURES.txt')
Si el nuevo nombre que queremos para nuestro archivo ya lo tiene un archivo existente, el archivo existente es reemplazado, si es una carpeta, la función retornará la excepción OSError
.
Otras formas de copiar archivos es con la función open() que viene integrada a Python, supongamos que quiero copiar un archivo de texto llamado emails.txt que se encuentra en mi escritorio y deseo copiarlo a mi carpeta Documentos:
archivo = open('C:\\Users\\MyUser\\Desktop\\emails.txt', 'r') leer = archivo.read() copiar = open('C:\\Users\\MyUser\\Documents\\emails.txt', 'w') copiar.writelines(leer)
- Lo que hemos hecho es guardar un una variable archivo la ubicación del archivo, con la función open que como primer parámetro recibe la ruta del archivo y como segundo parámetro el modo de apertura, en este caso le he pasado ‘r’ para decirle que quiero abrirlo y solo leer su contenido.
- Luego en un variable leer utilizo el método .read() para leer el contenido del archivo; en otra variable llamada copiar volvemos a usar open pero esta vez le digo que quiero llevar ese archivo a otra dirección que en este caso seria Documentos y le pasamos en el modo de apertura ‘w’ para indicar que queremos escribir en el archivo.
- Por último usamos el método .writelines() y le pasamos como argumento la variable leer que contiene los datos del archivo que queremos copiar a Documentos.
Otras operaciones
Estas funciones solo necesitan un argumento path
el cual determina el archivo o directorio en el que se trabajará.
Verificar la existencia de un archivo o carpeta:
>>> import os.path >>> os.path.exists('FEATURES.txt') True >>> os.path.exists('CARACTERISTICAS.txt') False
Verificar si la ruta dada como argumento es un archivo o un directorio:
>>> os.path.isfile('Documentos') False >>> os.path.isfile('CARACTERISTICAS.txt') True >>> os.path.isdir("Documentos") True >>> os.path.isdir("CARACTERISTICAS.txt") False
Entonces recordar, si quiero saber si un directorio existe utilizo os.path.isdir() y le pasamos como argumento la ruta de la carpeta y si quiero saber si un archivo existe usamos os.path.isfile()y le pasamos la ruta del archivo
Nuevo método para realizar operaciones con archivos y carpetas en Python:
En Python 3.4, se introdujo una nueva librería estandar para realizar operaciones con archivos y carpetas en Python, llamada pathlib.
Para usarla simplemente damos como argumento una ruta o nombre de archivo y creamos un objeto Path() usando slashes (/) y la librería se encarga del resto:
from pathlib import Path ''' Creamos un objeto Path con la ruta de la carpeta en la que estaremos trabajando ''' carpeta = Path('Documentos/archivos_texto/') # Usamos el slash para unir la ruta y el nombre de archivo ruta_archivo = carpeta / 'nombre_archivo.txt' archivo = open(ruta_archivo) print(archivo.read())
Debemos darnos cuenta de dos cosas aquí:
- Tenemos que usar slashes cuando usemos las funciones de la librería pathlib. El objeto Path() convertira los slash en el separador de archivos necesario para su sistema operativo.
- Si queremos agregar algo más al objeto Path() solo tenemos que usar el operador (/) directamente en el código. Ya no sería necesario unir rutas con el método os.path.join(a, b).