Como obter o nome do arquivo sem a extensão de um caminho no Python?

995

Como obter o nome do arquivo sem a extensão de um caminho no Python?

Joan Venge
fonte

Respostas:

1316

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.

Geo
fonte
13
Se essa é uma operação bastante comum, talvez ela mereça seu próprio comando oficial? Algo como os.path.filename (path_to_file) em vez de os.path.splitext (os.path.basename (path_to_file)) [0]
Fnord
19
E se o nome do arquivo contiver vários pontos?
matteok
101
Para quem quer saber o mesmo que matteok, se houver vários pontos, o splitext divide no último (assim splitext('kitty.jpg.zip')é ('kitty.jpg', '.zip')).
Chuck
50
Observe que esse código retorna o caminho completo do arquivo (sem a extensão), não apenas o nome do arquivo .
Aran-Fey
2
sim, então você teria que fazer splitext(basename('/some/path/to/file.txt'))[0](que eu sempre parecem estar fazendo)
CpILL
531

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.

gimel
fonte
2
@ Scott Scott: Você ainda precisa importar os.
precisa saber é
35
O que significa 'roll it'?
Larsh
50
É a abreviação de "roll your own", que significa "construa você mesmo" no inglês americano.
Scott C Wilson
2
@ Alan W. Smith, "Just roll it:" estava funcionando perfeitamente nos últimos 10 anos. O que significa "menos americano"? Não sou a favor de suas edições.
usar o seguinte comando
4
a edição torna mais claro. nem todo mundo tem o Inglês como sua primeira língua, para dizer algo como 'roll que' poderia aumentar a confusão
nxmohamad
327

Usando pathlibem Python 3.4 ou superior

from pathlib import Path

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

retornará

'file'
negrito
fonte
9
Esta é a maneira recomendada desde python 3.
Miladiouss
1
Observe que, como as os.pathsoluções, isso removerá apenas um ramal (ou suffix, como é pathlibchamado). Path('a.b.c').stem == 'a.b'
BallpointBen
@BallpointBen, qual é a melhor maneira de remover vários sufixos? Certamente deve haver uma maneira melhor do quePath(Path('a.b.c').stem).stem
hoan
1
@hoan Acho que ligar repetidamente .with_suffix('')é o caminho a percorrer. Você provavelmente gostaria de fazer um loop até p.suffix == ''.
BallpointBen
218
>>> print(os.path.splitext(os.path.basename("hemanth.txt"))[0])
hemanth
hemanth.hm
fonte
7
+1 para isso. 3 exatamente as mesmas respostas, mas esta é a mais direta. Você poderia ter usado `para mostrar o código e "/somepath/hermanth.txt" como uma instância de caminho.
Cregox 21/05
2
@ hemanth.hm Observe que nesta declaração que você forneceu, os.path.basenamenão é necessário. os.path.basenamedeve ser usado apenas para obter o nome do arquivo no caminho do arquivo.
arrt_
74

No Python 3.4+, você pode usar a pathlibsolução

from pathlib import Path

print(Path(your_path).resolve().stem)
Morgoth
fonte
4
Por que você 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.
Boris
1
Uma razão possível para usar 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'
William Allcock
30

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
jjisnow
fonte
1
Esta é a melhor solução do python 3 para o caso genérico de remover a extensão de um caminho completo. Usar stem também remove o caminho pai. Caso esteja esperando uma extensão dupla (como bla.tar.gz), você pode usá-la duas vezes: p.with_suffix (''). With_suffix ('').
Eelco van Vliet
24

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

fonte
16
Se você deseja dividir no último período, use o rsplit:'/root/dir/sub.exten/file.data.1.2.dat'.rsplit('.', 1)
IceArdor 4/14
21

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
Dheeraj Chakravarthi
fonte
1
index_of_dot = file_name.index ( '') Isso será feito depois de obter o nome base do arquivo para que ele costuma dividir em .env
Dheeraj Chakravarthi
2
Ponto importante, pois uma série de extensões como essa é comum. .tar.gz .tar.bz .tar.7z
2
Observe que '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.
Czechnology
15

@ IceAdor's refere-se ao rsplit em um comentário à solução do @ user2902201. O rsplit é a solução mais simples que suporta múltiplos períodos.

Aqui está explicitado:

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

meu relatório

dlink
fonte
13

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 ose, em seguida, use os.path.basename

importing osnão significa que você pode usar os.foosem se referir a os.

Devin Jeanpierre
fonte
1
embora se você quisesse ligar diretamente para foo, poderia usar from os import foo.
tgray 24/03/09
você tem uma versão muito fora do padrão do osmódulo se ele tiver um membro chamado foo.
Tadhg McDonald-Jensen
2
É um nome de espaço reservado. (por exemplo path, considere ou walk).
Devin Jeanpierre
13

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'
ScottMcC
fonte
os.path.splittext () é a versão 3.6+
Yzmir Ramirez
6

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
Alan W. Smith
fonte
Exceto pelo valor agregado de lidar com vários pontos, esse método é muito mais rápido que Path('/path/to/file.txt').stem. (1,23μs vs 8,39μs)
raratiru
Isto não funciona para o nome de arquivo nvdcve-1.1-2002.json.zip
Michele
Dividi-lo em fileBasename.split ('. Json') [0] e funcionou
Michele
4

import os

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

Isso retorna filenamesem 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 filenamepartir da temperatura com

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

Um procedimento com reconhecimento de várias extensões. Trabalhos para stre unicodecaminhos. 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'

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

No sistema Windows, usei também o prefixo drivername, como:

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

Portanto, como não preciso da letra da unidade ou do nome do diretório, uso:

>>> print(os.path.splitext(os.path.basename(s))[0])
akarmi
Zéiksz
fonte
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.

lidar com
fonte
0

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.

Nkoro Joseph Ahamefula
fonte
0

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)
Bilal
fonte
-1

Poderíamos fazer algumas coisas simples split/ popmá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
yckart
fonte
os.path.splitext () [0] faz a mesma coisa.
Charles Plager
@CharlesPlager os.path.splitext () não funcionará se houver vários pontos na extensão. stackoverflow.com/a/37760212/1250044
yckart 13/16
Funciona para mim: In [72]: os.path.splitext ('one.two.three.ext') Fora [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
fonte
-3

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'

Antonio Ramasco
fonte