¿Cómo obtener el nombre de archivo sin la extensión de una ruta en Python?
¿Cómo obtener el nombre de archivo sin la extensión de una ruta en Python?
Respuestas:
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 que
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.
os
.
Utilizando pathlib
en Python 3.4+
from pathlib import Path
Path('/root/dir/sub/file.ext').stem
volverá
'file'
os.path
soluciones, esto solo eliminará una extensión (o suffix
, como lo pathlib
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 hasta p.suffix == ''
.
>>> print(os.path.splitext(os.path.basename("hemanth.txt"))[0])
hemanth
`
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ón
from pathlib import Path
print(Path(your_path).resolve().stem)
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,
>>> from pathlib import Path
>>> p = Path("/a/b/c.txt")
>>> print(p.with_suffix(''))
\a\b\c
>>> print(p.stem)
c
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
'/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
>>> 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
'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.
Pero incluso cuando importo os, no puedo llamarlo path.basename. ¿Es posible llamarlo tan directamente como basename?
import os
y luego usar os.path.basename
import
ing os
no significa que pueda usar os.foo
sin hacer referencia a os
.
from os import foo
.
os
módulo si tiene un miembro llamado foo
.
path
, considere , o walk
).
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'
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
Path('/path/to/file.txt').stem
. (1,23μs vs 8.39μs)
import os
filename = C:\\Users\\Public\\Videos\\Sample Videos\\wildlife.wmv
Esto devuelve el filename
sin el extension
(C: \ Users \ Public \ Videos \ Sample Videos \ wildlife)
temp = os.path.splitext(filename)[0]
Ahora puede obtener solo filename
la temperatura con
os.path.basename(temp) #this returns just the filename (wildlife)
Un procedimiento consciente de múltiples extensiones. Obras para str
y unicode
caminos. 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'
import os
path = "a/b/c/abc.txt"
print os.path.splitext(os.path.basename(path))[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
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.
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.
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)
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).
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
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
import os filename, file_extension = os.path.splitext ('/ d1 / d2 / example.cs') filename es '/ d1 / d2 / example' file_extension is '.cs'