HOWTO · Python

Obtener el directorio de la ruta en Python

Este tutorial demuestra cómo extraer una parte de la ruta del archivo en Python.

En esta página

Para obtener el directorio padre de una ruta de archivo, pásala a os.path.dirname(). Como alternativa orientada a objetos, usa Path(file_path).parent de pathlib. Ambos devuelven el directorio que contiene el archivo; no indican el directorio de trabajo actual del proceso.

Los ejemplos usan rutas con barras diagonales para que sus resultados sean fáciles de leer. Las funciones de rutas de Python interpretan las rutas según el sistema operativo anfitrión. Para construir rutas a partir de componentes separados, usa os.path.join() o pathlib en vez de insertar un separador manualmente.

Entender los separadores de ruta

Una ruta separa los nombres de directorio y el componente final mediante un separador propio de cada plataforma. Los sistemas POSIX suelen usar /; las rutas de Windows suelen usar \\, aunque Windows también acepta / en muchas operaciones con rutas. os.sep proporciona el separador de la plataforma actual. Para el manejo habitual de rutas, pasa la ruta a os.path o usa pathlib, en lugar de elegir el separador mediante condiciones.

Obtener un nombre de archivo con os.path.basename

os.path.basename() devuelve el componente final de una ruta. En una ruta de archivo, suele ser el nombre del archivo, incluida su extensión; no devuelve el directorio. Para obtener el nombre del directorio final de una ruta de archivo, primero obtén su directorio padre con os.path.dirname() y luego pasa ese resultado a os.path.basename().

import os

file_path = "/home/user/documents/report.txt"
filename = os.path.basename(file_path)
parent_directory = os.path.dirname(file_path)
last_directory = os.path.basename(parent_directory)

print(filename)
print(last_directory)
report.txt
documents

Separar el nombre de archivo y la extensión con os.path.splitext

os.path.splitext() separa la extensión del componente final de la ruta y devuelve un par (root, ext). La extensión está vacía o empieza con un punto; esta función no devuelve un directorio. Si necesitas el directorio, usa os.path.dirname().

import os

file_path = "/home/user/documents/report.txt"
root, extension = os.path.splitext(file_path)

directory = os.path.dirname(file_path)
print(root)
print(extension)
print(directory)
/home/user/documents/report
.txt
/home/user/documents

Para un nombre de archivo como archive.tar.gz, splitext() separa únicamente el sufijo final, .gz. La raíz devuelta sigue conteniendo archive.tar, así que el manejo de extensiones debe ajustarse a la convención de nombres que use tu aplicación.

Obtener un directorio a partir de una ruta de archivo con os.path.dirname

os.path.dirname() devuelve como cadena la parte de una ruta que corresponde al directorio. Es la opción directa cuando ya tienes una ruta como cadena y quieres obtener el directorio padre de su componente final. El enlace disponible corresponde a la página en inglés; el inventario no incluye un destino localizado al español.

import os

file_path = "/home/user/documents/report.txt"
directory = os.path.dirname(file_path)

print(directory)
/home/user/documents

Usa la misma variable para la entrada y la llamada a la función. La función opera sobre el texto de la ruta; no comprueba si el archivo o el directorio existen. Si necesitas crear, enumerar o inspeccionar el directorio, realiza por separado la operación correspondiente del sistema de archivos.

Obtener un directorio padre con pathlib

pathlib proporciona objetos Path para trabajar con rutas. El atributo Path.parent devuelve la ruta padre como otro objeto Path, lo que resulta práctico al encadenar operaciones con rutas o al pasar rutas a API que aceptan valores similares a una ruta.

from pathlib import Path

file_path = Path("/home/user/documents/report.txt")
parent_directory = file_path.parent

print(parent_directory)
print(file_path.parts)
/home/user/documents
('/', 'home', 'user', 'documents', 'report.txt')

Path.parts es una tupla que contiene los componentes de la ruta; es un atributo, no una función. Elige Path.parent para obtener el directorio padre y usa parts cuando necesites examinar o indexar componentes individuales.

Resolver rutas relativas y obtener el directorio de trabajo actual

Una ruta relativa se interpreta desde el directorio de trabajo actual del proceso. os.path.abspath() convierte una ruta relativa en una ruta absoluta usando ese directorio de trabajo. Para obtener el directorio que contiene la ruta resultante, pásala a os.path.dirname(). El enlace disponible corresponde a la página en inglés; el inventario no incluye un destino localizado al español.

import os

relative_path = "documents/report.txt"
absolute_path = os.path.abspath(relative_path)
file_directory = os.path.dirname(absolute_path)

print(absolute_path)
print(file_directory)
/work/documents/report.txt
/work/documents

Path.cwd() devuelve el directorio de trabajo actual como objeto Path, mientras que os.getcwd() lo devuelve como cadena. Ambos indican el directorio de trabajo del proceso, que puede ser distinto del directorio que contiene el script de Python. Úsalos cuando necesites saber desde dónde parten las rutas relativas; dentro de un script, usa Path(__file__).parent si necesitas el directorio que contiene ese script.

import os
from pathlib import Path

print(Path.cwd())
print(os.getcwd())
/work
/work