¿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?

Joan Venge
fuente

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.

Geo
fuente
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.

gimel
fuente
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'
negrita
fuente
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
hemanth.hm
fuente
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)
Morgoth
fuente
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
jjisnow
fuente
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

fuente
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
Dheeraj Chakravarthi
fuente
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

dlink
fuente
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.

Devin Jeanpierre
fuente
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'
ScottMcC
fuente
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
Alan W. Smith
fuente
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)
código de aprendizaje
fuente
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'

fuente
1
import os
path = "a/b/c/abc.txt"
print os.path.splitext(os.path.basename(path))[0]
usuario4949344
fuente
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
Zéiksz
fuente
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.

encargarse de
fuente
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.

Nkoro Joseph Ahamefula
fuente
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)
Bilal
fuente
-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
yckart
fuente
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
shivendra singh
fuente
-3

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

Antonio Ramasco
fuente