Como obter o nome do arquivo sem a extensão de um caminho no Python?
Como obter o nome do arquivo sem a extensão de um caminho no Python?
Respostas:
Obtendo o nome do arquivo sem a extensão:
import os
print(os.path.splitext("/path/to/some/file.txt")[0])
Impressões:
/path/to/some/file
Documentação paraos.path.splitext
.
Nota importante: Se o nome do arquivo tiver vários pontos, somente a extensão após a última será removida. Por exemplo:
import os
print(os.path.splitext("/path/to/some/file.txt.zip.asc")[0])
Impressões:
/path/to/some/file.txt.zip
Veja outras respostas abaixo se precisar lidar com esse caso.
splitext('kitty.jpg.zip')
é ('kitty.jpg', '.zip')
).
splitext(basename('/some/path/to/file.txt'))[0]
(que eu sempre parecem estar fazendo)
Você pode fazer o seu próprio com:
>>> 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: Se houver mais de um .
no nome do arquivo, somente o último será removido. Por exemplo:
/root/dir/sub/file.ext.zip -> file.ext
/root/dir/sub/file.ext.tar.gz -> file.ext.tar
Veja abaixo outras respostas que abordam isso.
os
.
Usando pathlib
em Python 3.4 ou superior
from pathlib import Path
Path('/root/dir/sub/file.ext').stem
retornará
'file'
os.path
soluções, isso removerá apenas um ramal (ou suffix
, como é pathlib
chamado). Path('a.b.c').stem == 'a.b'
Path(Path('a.b.c').stem).stem
.with_suffix('')
é o caminho a percorrer. Você provavelmente gostaria de fazer um loop até p.suffix == ''
.
>>> print(os.path.splitext(os.path.basename("hemanth.txt"))[0])
hemanth
`
para mostrar o código e "/somepath/hermanth.txt" como uma instância de caminho.
os.path.basename
não é necessário. os.path.basename
deve ser usado apenas para obter o nome do arquivo no caminho do arquivo.
No Python 3.4+, você pode usar a pathlib
solução
from pathlib import Path
print(Path(your_path).resolve().stem)
resolve()
segue o caminho? É realmente possível obter um caminho para um arquivo e não fazer com que o nome do arquivo faça parte do caminho sem isso? Isso significa que, se você der um caminho para o link simbólico, retornará o nome do arquivo (sem a extensão) do arquivo para o qual o link simbólico aponta.
resolve()
é ajudar a lidar com o problema de vários pontos. A resposta abaixo sobre o uso do índice não funcionará se o caminho for './foo.tar.gz'
https://docs.python.org/3/library/os.path.html
No python 3 pathlib "O módulo pathlib oferece objetos de caminho de alto nível." tão,
>>> from pathlib import Path
>>> p = Path("/a/b/c.txt")
>>> print(p.with_suffix(''))
\a\b\c
>>> print(p.stem)
c
Se você deseja manter o caminho para o arquivo e apenas remover a extensão
>>> 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 () não funcionará se houver vários pontos na extensão.
Por exemplo, 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
Você pode apenas encontrar o índice do primeiro ponto no nome da base e depois dividi-lo para obter apenas o nome do arquivo sem extensão.
>>> 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')
lança uma exceção ValueError se a agulha (no caso acima, o ponto .
) não for encontrada no palheiro. Arquivos sem qualquer extensão também existem.
Mas mesmo quando importo o SO, não consigo chamá-lo de path.basename. É possível chamá-lo tão diretamente quanto o nome da base?
import os
e, em seguida, use os.path.basename
import
ing os
não significa que você pode usar os.foo
sem se referir a os
.
from os import foo
.
os
módulo se ele tiver um membro chamado foo
.
path
, considere ou walk
).
Pensei em incluir uma variação no uso do os.path.splitext sem a necessidade de usar a indexação de array.
A função sempre retorna um (root, ext)
par, portanto é seguro usar:
root, ext = os.path.splitext(path)
Exemplo:
>>> import os
>>> path = 'my_text_file.txt'
>>> root, ext = os.path.splitext(path)
>>> root
'my_text_file'
>>> ext
'.txt'
Os outros métodos não removem várias extensões. Alguns também têm problemas com nomes de arquivos que não têm extensões. Esse trecho trata das instâncias e funciona no Python 2 e 3. Ele pega o nome da base do caminho, divide o valor em pontos e retorna o primeiro, que é a parte inicial do nome do arquivo.
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
Aqui está um conjunto de exemplos para executar:
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))
Em todos os casos, o valor impresso é:
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
Isso retorna filename
sem extension
(C: \ Usuários \ Público \ Vídeos \ Vídeos de exemplo \ vida selvagem)
temp = os.path.splitext(filename)[0]
Agora você pode obter apenas a filename
partir da temperatura com
os.path.basename(temp) #this returns just the filename (wildlife)
Um procedimento com reconhecimento de várias extensões. Trabalhos para str
e unicode
caminhos. Funciona em Python 2 e 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)
Comportamento:
>>> 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]
Por conveniência, uma função simples envolvendo os dois 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
Testado com Python 3.5.
a maneira mais fácil de resolver isso é
import ntpath
print('Base name is ',ntpath.basename('/path/to/the/file/'))
isso economiza tempo e custos de computação.
Muito muito muito simpely nenhum outro módulo !!!
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)
Poderíamos fazer algumas coisas simples split
/ pop
mágicas, como visto aqui ( https://stackoverflow.com/a/424006/1250044 ), para extrair o nome do arquivo (respeitando as diferenças de janelas e 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
importar o nome do arquivo, extensão_do_arquivo = os.path.splitext ('/ d1 / d2 / exemplo.cs') o nome do arquivo é '/ d1 / d2 / exemplo' a extensão do arquivo é '.cs'