HOWTO · Python

Python Obtener un nombre de archivo sin extensión de la ruta

Este tutorial muestra cómo obtener un nombre de archivo sin extensión a partir de la ruta de archivo en Python

En esta página

Para obtener de una ruta un nombre de archivo sin su extensión final, usa Path(file_path).stem. Por ejemplo, la ruta Desktop/folder/myfile.txt tiene como nombre base myfile. Path.stem es una propiedad, así que se accede a ella sin paréntesis. Los ejemplos siguientes usan una cadena con la ruta e imprimen el nombre resultante.

Obtener un nombre de archivo sin su extensión final con Path.stem

pathlib.Path gestiona los separadores de ruta de la plataforma actual, así que no necesitas dividir la ruta por tu cuenta. Crea un objeto Path a partir de la cadena y consulta su propiedad stem. Esto elimina la extensión final y conserva los puntos anteriores del nombre de archivo.

Ejecuta este ejemplo:

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

from pathlib import Path

file_path = "Desktop/folder/myfile.txt"
file_name = Path(file_path).stem
print(file_name)
myfile

Usar os.path.splitext() para eliminar la extensión final

La función de la biblioteca estándar os.path.splitext() devuelve un par: la parte de la ruta anterior a la extensión final y la extensión misma. Selecciona el primer elemento para eliminar esa extensión. Si también necesitas únicamente el último componente de la ruta, dividirla por / funciona en este ejemplo, pero depende de ese separador y es menos portable entre sistemas operativos.

Ejecuta este ejemplo:

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

import os

file_path = "Desktop/folder/myfile.txt"
path_without_suffix = os.path.splitext(file_path)[0]
file_name = path_without_suffix.split("/")[-1]
print(file_name)
myfile

Extraer el nombre base antes de eliminar la extensión

Para resolverlo con os.path teniendo en cuenta la ruta, llama primero a os.path.basename() para obtener el componente final y pasa después ese resultado a os.path.splitext(). El nombre base de Desktop/folder/myfile.txt es myfile.txt; al eliminar su extensión final queda myfile. Este patrón evita tener que elegir manualmente un separador de ruta.

Ejecuta este ejemplo:

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

import os

file_path = "Desktop/folder/myfile.txt"
basename = os.path.basename(file_path)
file_name = os.path.splitext(basename)[0]
print(file_name)
myfile

Gestionar las extensiones compuestas y los puntos en los nombres de archivo

Estos métodos estándar eliminan una sola extensión final, no todas las partes separadas por puntos. Para myfile.tar.gz, tanto Path.stem como os.path.splitext() producen myfile.tar. Esto resulta útil cuando solo .gz es la extensión. Si la aplicación considera .tar.gz una sola extensión compuesta, trata explícitamente esa extensión conocida; por ejemplo, con name.removesuffix(".tar.gz"). str.removesuffix() se añadió en Python 3.9, por lo que esta expresión requiere Python 3.9 o posterior. En versiones anteriores, usa name[:-len(".tar.gz")] if name.endswith(".tar.gz") else name para eliminar de forma segura esa terminación exacta.

Un nombre sin extensión, como README, sigue siendo README con Path.stem y os.path.splitext(). Un nombre que empieza por punto, como .bashrc, se trata como un archivo oculto sin extensión: tanto Path(".bashrc").stem como os.path.splitext(".bashrc")[0] devuelven .bashrc. En cambio, archive. termina en punto: Path.stem lo conserva y devuelve archive., mientras que os.path.splitext() trata el punto como una extensión y devuelve archive.

Dividir por el primer punto hace algo distinto: trunca el resto del nombre. Para my.file.tar.gz, dividir por el primer punto produce my, mientras que eliminar solo la extensión final produce my.file.tar. Elige el método según si necesitas eliminar una extensión compuesta conocida, solo la última extensión o todo lo que sigue al primer punto. Dividir por el primer punto también convierte .bashrc en una cadena vacía, así que no es adecuado si quieres conservar los nombres que empiezan por punto.

Ejecuta este ejemplo:

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

from pathlib import Path

for name in ("myfile.tar.gz", "my.file.tar.gz"):
    print(Path(name).stem)
    print(name.split(".", 1)[0])
myfile.tar
myfile
my.file.tar
my