¿Cómo obtener el nombre de archivo sin la extensión de una ruta en Python?
996
Obteniendo el nombre del archivo sin la extensión:
import os
print(os.path.splitext("/path/to/some/file.txt")[0])
Huellas dactilares:
/path/to/some/file
Documentación paraos.path.splitext
.
Nota importante: si el nombre de archivo tiene varios puntos, solo se elimina la extensión después del último. Por ejemplo:
import os
print(os.path.splitext("/path/to/some/file.txt.zip.asc")[0])
Huellas dactilares:
/path/to/some/file.txt.zip
Vea otras respuestas a continuación si necesita manejar ese caso.
splitext('kitty.jpg.zip')
es('kitty.jpg', '.zip')
).splitext(basename('/some/path/to/file.txt'))[0]
(que siempre parece quePuedes hacer el tuyo con:
Nota importante: si hay más de uno
.
en el nombre del archivo, solo se eliminará el último. Por ejemplo:Vea a continuación otras respuestas que abordan eso.
fuente
os
.Utilizando
pathlib
en Python 3.4+volverá
fuente
os.path
soluciones, esto solo eliminará una extensión (osuffix
, como lopathlib
llama).Path('a.b.c').stem == 'a.b'
Path(Path('a.b.c').stem).stem
.with_suffix('')
es el camino a seguir. Probablemente quieras hacer un bucle hastap.suffix == ''
.fuente
`
para mostrar el código y "/somepath/hermanth.txt" como una instancia de ruta.os.path.basename
no es necesario.os.path.basename
solo debe usarse para obtener el nombre del archivo de la ruta del archivo.En Python 3.4+ puedes usar la
pathlib
soluciónfuente
resolve()
el camino? ¿Es realmente posible obtener una ruta a un archivo y no hacer que el nombre de archivo sea parte de la ruta sin eso? Esto significa que si le da una ruta al enlace simbólico, devolverá el nombre del archivo (sin la extensión) del archivo al que apunta el enlace simbólico.resolve()
es ayudar a lidiar con el problema de múltiples puntos. La respuesta a continuación sobre el uso del índice no funcionará si la ruta es './foo.tar.gz'https://docs.python.org/3/library/os.path.html
En python 3 pathlib "El módulo pathlib ofrece objetos de ruta de alto nivel". entonces,
fuente
Si desea mantener la ruta al archivo y simplemente eliminar la extensión
fuente
'/root/dir/sub.exten/file.data.1.2.dat'.rsplit('.', 1)
os.path.splitext () no funcionará si hay varios puntos en la extensión.
Por ejemplo, images.tar.gz
Puede encontrar el índice del primer punto en el nombre base y luego cortar el nombre base para obtener solo el nombre del archivo sin extensión.
fuente
.tar.gz
.tar.bz
.tar.7z
'haystack'.index('needle')
arroja una excepción ValueError si la aguja (en el caso anterior, el punto.
) no se encuentra en el pajar. Los archivos sin ninguna extensión también existen.@ IceAdor se refiere a rsplit en un comentario a la solución de @ user2902201. rsplit es la solución más simple que admite múltiples períodos.
Aquí se detalla:
mi reporte
fuente
import os
y luego usaros.path.basename
import
ingos
no significa que pueda usaros.foo
sin hacer referencia aos
.fuente
from os import foo
.os
módulo si tiene un miembro llamadofoo
.path
, considere , owalk
).Pensé que agregaría una variación al uso del os.path.splitext sin la necesidad de usar la indexación de matrices.
La función siempre devuelve un
(root, ext)
par, por lo que es seguro de usar:root, ext = os.path.splitext(path)
Ejemplo:
fuente
Los otros métodos no eliminan múltiples extensiones. Algunos también tienen problemas con los nombres de archivo que no tienen extensiones. Este fragmento se ocupa de ambas instancias y funciona tanto en Python 2 como en 3. Toma el nombre base de la ruta, divide el valor en puntos y devuelve el primero, que es la parte inicial del nombre de archivo.
Aquí hay un conjunto de ejemplos para ejecutar:
En todos los casos, el valor impreso es:
fuente
Path('/path/to/file.txt').stem
. (1,23μs vs 8.39μs)import os
Esto devuelve el
filename
sin elextension
(C: \ Users \ Public \ Videos \ Sample Videos \ wildlife)Ahora puede obtener solo
filename
la temperatura confuente
Un procedimiento consciente de múltiples extensiones. Obras para
str
yunicode
caminos. Funciona en Python 2 y 3.Comportamiento:
fuente
fuente
En el sistema Windows también utilicé el prefijo del nombre del controlador, como:
Entonces, como no necesito la letra de unidad o el nombre del directorio, uso:
fuente
Por conveniencia, una función simple que envuelve los dos métodos de
os.path
:Probado con Python 3.5.
fuente
la forma más fácil de resolver esto es
Esto le ahorra tiempo y costos de cálculo.
fuente
Muy muy muy simplemente no hay otros módulos !!!
fuente
Podríamos hacer algo simple
split
/pop
mágico como se ve aquí ( https://stackoverflow.com/a/424006/1250044 ), para extraer el nombre de archivo (respetando las diferencias de Windows y POSIX).fuente
fuente
import os filename, file_extension = os.path.splitext ('/ d1 / d2 / example.cs') filename es '/ d1 / d2 / example' file_extension is '.cs'
fuente