varios - rutas de archivos en python
¿Cómo obtener el nombre de archivo sin la extensión de una ruta en Python? (19)
Pero incluso cuando importo OS, no puedo llamarlo path.basename. ¿Es posible llamarlo tan directamente como nombre base?
import os
, y luego usar os.path.basename
import
os
no significa que pueda usar os.foo
sin referirse a os
.
¿Cómo obtener el nombre de archivo sin la extensión de una ruta en Python?
@ IceAdor''s se refiere a rsplit en un comentario a la solución de @ user2902201. rsplit es la solución más simple que soporta múltiples períodos.
Aquí está explicado:
file = ''my.report.txt''
print file.rsplit(''.'', 1)[0]
mi reporte
En el sistema de Windows usé también el prefijo de nombre de usuario, como:
>>> 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''
Entonces, como no necesito letra de unidad o nombre de directorio, uso:
>>> s = ''c://temp//akarmi.txt''
>>> print(os.path.splitext(s)[0])
c:/temp/akarmi
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 computación.
Obteniendo el nombre del archivo sin la extensión:
import os
print(os.path.splitext("path_to_file")[0])
Para completar, aquí está la solución de pathlib
para python 3.2+:
from pathlib import Path
print(Path(your_path).resolve().stem)
Para mayor comodidad, una función simple que envuelve los dos métodos de https://docs.python.org/3/library/os.path.html :
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.
Pensé que incluiría una variación en el uso de os.path.splitext sin la necesidad de usar la indexación de matriz.
La función siempre devuelve un par (root, ext)
para que sea seguro utilizar:
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''
Podríamos hacer un simple split
/ pop
magic como se ve aquí ( https://.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
Sólo tienes que rodar:
>>> 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''
Si desea mantener la ruta del 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
Un procedimiento de extensión múltiple. Trabajos para str
y unicode
caminos. Trabaja en Python 2 y 3.
import os
path = "a/b/c/abc.txt"
print os.path.splitext(os.path.basename(path))[0]
Comportamiento:
>>> from pathlib import Path
>>> p = Path("/a/b/c.txt")
>>> print(p.with_suffix(''''))
/a/b/c
>>> print(p.stem)
c
Una versión legible, usando Pathlib
en Python 3.4+
from pathlib import Path
Path(''/root/dir/sub/file.ext'').stem
Imprimirá
expediente
Si la ruta puede ser un enlace simbólico , entonces agregue resolve()
Path(''/root/dir/sub/file.ext'').resolve().stem
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
Simplemente puede encontrar el índice del primer punto en el nombre base y luego cortar el nombre base para obtener solo el nombre de 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
https://docs.python.org/3/library/os.path.html
En python 3 pathlib "El módulo pathlib ofrece objetos de ruta de alto nivel". asi que,
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)
import os
filename = C://Users//Public//Videos//Sample Videos//wildlife.wmv
Esto devuelve el filename
sin la extension
(C: / Users / Public / Videos / Sample Videos / wildlife)
temp = os.path.splitext(filename)[0]
Ahora puede obtener solo el filename
de filename
de la temp con
os.path.basename(temp) #this returns just the filename (wildlife)
>>> print(os.path.splitext(os.path.basename("hemanth.txt"))[0])
hemanth
>>> print(os.path.splitext(os.path.basename(s))[0])
akarmi
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