¿Cómo obtener el nombre de archivo sin la extensión de una ruta en Python?


996

¿Cómo obtener el nombre de archivo sin la extensión de una ruta en Python?

Respuestas:


1317

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.


13
Si esta es una operación bastante común, ¿tal vez debería merecer su propio comando oficial? Algo así como os.path.filename (path_to_file) en lugar de os.path.splitext (os.path.basename (path_to_file)) [0]
Fnord

19
¿Qué pasa si el nombre del archivo contiene varios puntos?
matteok

101
Para cualquiera que se pregunte lo mismo que matteok, si hay varios puntos, splitext se divide en el último (así splitext('kitty.jpg.zip')es ('kitty.jpg', '.zip')).
Chuck

50
Tenga en cuenta que este código devuelve la ruta completa del archivo (sin la extensión), no solo el nombre del archivo .
Aran-Fey

2
Sí, así que tendrías que hacer splitext(basename('/some/path/to/file.txt'))[0](que siempre parece que
estoy

532

Puedes hacer el tuyo con:

>>> import os
>>> base=os.path.basename('/root/dir/sub/file.ext')
>>> base
'file.ext'
>>> os.path.splitext(base)
('file', '.ext')
>>> os.path.splitext(base)[0]
'file'

Nota importante: si hay más de uno .en el nombre del archivo, solo se eliminará el último. Por ejemplo:

/root/dir/sub/file.ext.zip -> file.ext

/root/dir/sub/file.ext.tar.gz -> file.ext.tar

Vea a continuación otras respuestas que abordan eso.


2
@ScottWilson: Sin embargo, aún tiene que importar os.
LarsH

35
¿Qué significa 'rodarlo'?
LarsH

50
Es la abreviatura de "rodar el suyo", que significa "construirlo usted mismo" en inglés americano.
Scott C Wilson

2
@Alan W. Smith, "Just roll it:" estuvo funcionando perfectamente bien durante los últimos 10 años. ¿Qué significa "menos estadounidense"? No estoy a favor de tus ediciones.
Lógica1

44
la edición lo hace más claro. no todos tienen Inglés como primera lengua por lo que dice algo como 'roll que' podría aumentar la confusión
nxmohamad

327

Utilizando pathliben Python 3.4+

from pathlib import Path

Path('/root/dir/sub/file.ext').stem

volverá

'file'

99
Esta es la forma recomendada desde Python 3.
Miladiouss

1
Tenga en cuenta que, al igual que las os.pathsoluciones, esto solo eliminará una extensión (o suffix, como lo pathlibllama). Path('a.b.c').stem == 'a.b'
BallpointBen

@BallpointBen, ¿cuál es la forma óptima de eliminar múltiples sufijos? Seguramente debe haber una mejor manera quePath(Path('a.b.c').stem).stem
hoan

1
@hoan Creo que llamar repetidamente .with_suffix('')es el camino a seguir. Probablemente quieras hacer un bucle hasta p.suffix == ''.
BallpointBen

218
>>> print(os.path.splitext(os.path.basename("hemanth.txt"))[0])
hemanth

77
+1 por esto. 3 respuestas exactamente iguales, pero esta es la más directa. Simplemente podría haber usado `para mostrar el código y "/somepath/hermanth.txt" como una instancia de ruta.
cregox

2
@ hemanth.hm Tenga en cuenta que en esta declaración que proporcionó, os.path.basenameno es necesario. os.path.basenamesolo debe usarse para obtener el nombre del archivo de la ruta del archivo.
arrt_

74

En Python 3.4+ puedes usar la pathlibsolución

from pathlib import Path

print(Path(your_path).resolve().stem)

44
¿Por qué 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.
Boris

1
Una posible razón para usar 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'
William Allcock

30

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,

>>> from pathlib import Path
>>> p = Path("/a/b/c.txt")
>>> print(p.with_suffix(''))
\a\b\c
>>> print(p.stem)
c

1
Esta es la mejor solución de Python 3 para el caso genérico de eliminar la extensión de una ruta completa. El uso de tallo también elimina la ruta principal. En caso de que espere una doble extensión (como bla.tar.gz), incluso puede usarla dos veces: p.with_suffix (''). With_suffix ('').
Eelco van Vliet

24

Si desea mantener la ruta al archivo y simplemente eliminar la extensión

>>> file = '/root/dir/sub.exten/file.data.1.2.dat'
>>> print ('.').join(file.split('.')[:-1])
/root/dir/sub.exten/file.data.1.2

16
Si desea dividir en el último período, use rsplit:'/root/dir/sub.exten/file.data.1.2.dat'.rsplit('.', 1)
IceArdor

21

os.path.splitext () no funcionará si hay varios puntos en la extensión.

Por ejemplo, images.tar.gz

>>> import os
>>> file_path = '/home/dc/images.tar.gz'
>>> file_name = os.path.basename(file_path)
>>> print os.path.splitext(file_name)[0]
images.tar

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.

>>> import os
>>> file_path = '/home/dc/images.tar.gz'
>>> file_name = os.path.basename(file_path)
>>> index_of_dot = file_name.index('.')
>>> file_name_without_extension = file_name[:index_of_dot]
>>> print file_name_without_extension
images

1
index_of_dot = file_name.index ('.') Esto se hará después de obtener el nombre base del archivo para que no se divida en .env
Dheeraj Chakravarthi

2
Punto importante, ya que una serie de extensiones como esta es común. .tar.gz .tar.bz .tar.7z

2
Tenga en cuenta que '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.
Czechnology

15

@ 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:

file = 'my.report.txt'
print file.rsplit('.', 1)[0]

mi reporte


13

Pero incluso cuando importo os, no puedo llamarlo path.basename. ¿Es posible llamarlo tan directamente como basename?

import osy luego usar os.path.basename

importing osno significa que pueda usar os.foosin hacer referencia a os.


1
aunque si quisieras llamar a foo directamente, podrías usarlo from os import foo.
tgray

tiene una versión muy no estándar del osmódulo si tiene un miembro llamado foo.
Tadhg McDonald-Jensen

2
Es un nombre de marcador de posición. (por ejemplo path, considere , o walk).
Devin Jeanpierre

13

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:

>>> import os
>>> path = 'my_text_file.txt'
>>> root, ext = os.path.splitext(path)
>>> root
'my_text_file'
>>> ext
'.txt'

os.path.splittext () es la versión 3.6+
Yzmir Ramirez

6

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.

import os

def get_filename_without_extension(file_path):
    file_basename = os.path.basename(file_path)
    filename_without_extension = file_basename.split('.')[0]
    return filename_without_extension

Aquí hay un conjunto de ejemplos para ejecutar:

example_paths = [
    "FileName", 
    "./FileName",
    "../../FileName",
    "FileName.txt", 
    "./FileName.txt.zip.asc",
    "/path/to/some/FileName",
    "/path/to/some/FileName.txt",
    "/path/to/some/FileName.txt.zip.asc"
]

for example_path in example_paths:
    print(get_filename_without_extension(example_path))

En todos los casos, el valor impreso es:

FileName

Excepto por el valor agregado de manejar múltiples puntos, este método es mucho más rápido que Path('/path/to/file.txt').stem. (1,23μs vs 8.39μs)
raratiru

Esto no funciona para el nombre de archivo nvdcve-1.1-2002.json.zip
Michele

Lo dividí en fileBasename.split ('. Json') [0] y funcionó
Michele

4

import os

filename = C:\\Users\\Public\\Videos\\Sample Videos\\wildlife.wmv

Esto devuelve el filenamesin el extension(C: \ Users \ Public \ Videos \ Sample Videos \ wildlife)

temp = os.path.splitext(filename)[0]  

Ahora puede obtener solo filenamela temperatura con

os.path.basename(temp)   #this returns just the filename (wildlife)

3

Un procedimiento consciente de múltiples extensiones. Obras para stry unicodecaminos. Funciona en Python 2 y 3.

import os

def file_base_name(file_name):
    if '.' in file_name:
        separator_index = file_name.index('.')
        base_name = file_name[:separator_index]
        return base_name
    else:
        return file_name

def path_base_name(path):
    file_name = os.path.basename(path)
    return file_base_name(file_name)

Comportamiento:

>>> path_base_name('file')
'file'
>>> path_base_name(u'file')
u'file'
>>> path_base_name('file.txt')
'file'
>>> path_base_name(u'file.txt')
u'file'
>>> path_base_name('file.tar.gz')
'file'
>>> path_base_name('file.a.b.c.d.e.f.g')
'file'
>>> path_base_name('relative/path/file.ext')
'file'
>>> path_base_name('/absolute/path/file.ext')
'file'
>>> path_base_name('Relative\\Windows\\Path\\file.txt')
'file'
>>> path_base_name('C:\\Absolute\\Windows\\Path\\file.txt')
'file'
>>> path_base_name('/path with spaces/file.ext')
'file'
>>> path_base_name('C:\\Windows Path With Spaces\\file.txt')
'file'
>>> path_base_name('some/path/file name with spaces.tar.gz.zip.rar.7z')
'file name with spaces'

1
import os
path = "a/b/c/abc.txt"
print os.path.splitext(os.path.basename(path))[0]

0

En el sistema Windows también utilicé el prefijo del nombre del controlador, como:

>>> s = 'c:\\temp\\akarmi.txt'
>>> print(os.path.splitext(s)[0])
c:\temp\akarmi

Entonces, como no necesito la letra de unidad o el nombre del directorio, uso:

>>> print(os.path.splitext(os.path.basename(s))[0])
akarmi

0

Por conveniencia, una función simple que envuelve los dos métodos de os.path:

def filename(path):
  """Return file name without extension from path.

  See https://docs.python.org/3/library/os.path.html
  """
  import os.path
  b = os.path.split(path)[1]  # path, *filename*
  f = os.path.splitext(b)[0]  # *file*, ext
  #print(path, b, f)
  return f

Probado con Python 3.5.


0

la forma más fácil de resolver esto es

import ntpath 
print('Base name is ',ntpath.basename('/path/to/the/file/'))

Esto le ahorra tiempo y costos de cálculo.


0

Muy muy muy simplemente no hay otros módulos !!!

import os
p = r"C:\Users\bilal\Documents\face Recognition python\imgs\northon.jpg"

# Get the filename only from the initial file path.
filename = os.path.basename(p)

# Use splitext() to get filename and extension separately.
(file, ext) = os.path.splitext(filename)

# Print outcome.
print("Filename without extension =", file)
print("Extension =", ext)

-1

Podríamos hacer algo simple split/ popmágico como se ve aquí ( https://stackoverflow.com/a/424006/1250044 ), para extraer el nombre de archivo (respetando las diferencias de Windows y POSIX).

def getFileNameWithoutExtension(path):
  return path.split('\\').pop().split('/').pop().rsplit('.', 1)[0]

getFileNameWithoutExtension('/path/to/file-0.0.1.ext')
# => file-0.0.1

getFileNameWithoutExtension('\\path\\to\\file-0.0.1.ext')
# => file-0.0.1

os.path.splitext () [0] hace lo mismo.
Charles Plager

@CharlesPlager os.path.splitext () no funcionará si hay varios puntos en la extensión. stackoverflow.com/a/37760212/1250044
yckart el

Funciona para mí: En [72]: os.path.splitext ('one.two.three.ext') Out [72]: ('one.two.three', '.ext')
Charles Plager

-1
import os
list = []
def getFileName( path ):
for file in os.listdir(path):
    #print file
    try:
        base=os.path.basename(file)
        splitbase=os.path.splitext(base)
        ext = os.path.splitext(base)[1]
        if(ext):
            list.append(base)
        else:
            newpath = path+"/"+file
            #print path
            getFileName(newpath)
    except:
        pass
return list

getFileName("/home/weexcel-java3/Desktop/backup")
print list

-3

import os filename, file_extension = os.path.splitext ('/ d1 / d2 / example.cs') filename es '/ d1 / d2 / example' file_extension is '.cs'

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.