Come ottenere il nome file senza l'estensione da un percorso in Python?


Risposte:


1316

Ottenere il nome del file senza l'estensione:

import os
print(os.path.splitext("/path/to/some/file.txt")[0])

stampe:

/path/to/some/file

Documentazione peros.path.splitext .

Nota importante: se il nome file ha più punti, viene rimossa solo l'estensione dopo l'ultima. Per esempio:

import os
print(os.path.splitext("/path/to/some/file.txt.zip.asc")[0])

stampe:

/path/to/some/file.txt.zip

Vedi altre risposte di seguito se è necessario gestire quel caso.


13
Se questa è un'operazione abbastanza comune, forse dovrebbe meritare il proprio comando ufficiale? Qualcosa come os.path.filename (path_to_file) invece di os.path.splitext (os.path.basename (path_to_file)) [0]
Fnord

19
Cosa succede se il nome file contiene più punti?
matteok,

101
Per chiunque si chieda lo stesso di matteok, se ci sono più punti, splitext si divide all'ultimo (quindi splitext('kitty.jpg.zip')('kitty.jpg', '.zip')).
Chuck,

50
Si noti che questo codice restituisce il percorso completo del file (senza estensione), non solo il nome del file .
Aran-Fey,

2
sì, quindi dovresti fare splitext(basename('/some/path/to/file.txt'))[0]( cosa che mi sembra sempre di fare)
CpILL

531

Puoi crearne uno tuo 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: se ce n'è più di uno . nel nome file, viene rimossa solo l'ultima. Per esempio:

/root/dir/sub/file.ext.zip -> file.ext

/root/dir/sub/file.ext.tar.gz -> file.ext.tar

Vedi sotto per altre risposte a cui rivolgersi.


2
@ScottWilson: devi comunque importare os.
LarsH

35
Che cosa significa "roll it"?
LarsH

50
È l'abbreviazione di "roll your own", che significa "costruiscilo da te" in inglese americano.
Scott C Wilson,

2
@Alan W. Smith, "Basta farlo:" ha funzionato perfettamente negli ultimi 10 anni. Che cosa significa "meno americano"? Non sono a favore delle tue modifiche.
Logica1

4
la modifica lo rende più chiaro. non tutti hanno l'inglese come prima lingua, quindi dire qualcosa come 'roll it' potrebbe aggiungere confusione
nxmohamad,

327

Utilizzo pathlibin Python 3.4+

from pathlib import Path

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

tornerà

'file'

9
Questo è il modo raccomandato da Python 3.
Miladiouss,

1
Si noti che, come le os.pathsoluzioni, questo eliminerà solo un interno (o suffix, come lo pathlibchiama). Path('a.b.c').stem == 'a.b'
BallpointBen

@BallpointBen qual è il modo ottimale di rimuovere più suffissi? Sicuramente ci deve essere un modo migliore diPath(Path('a.b.c').stem).stem
hoan

1
@hoan Penso che chiamare ripetutamente .with_suffix('')sia la strada da percorrere. Probabilmente vorrai fare un ciclo fino a quando p.suffix == ''.
BallpointBen,

218
>>> print(os.path.splitext(os.path.basename("hemanth.txt"))[0])
hemanth

7
+1 per questo. 3 risposte identiche, ma questa è la più diretta. Avresti potuto semplicemente usare `per mostrare il codice e "/somepath/hermanth.txt" come istanza di percorso.
cregox,

2
@emanth.hm Nota che in questa dichiarazione hai fornito, os.path.basenamenon è necessario. os.path.basenamedovrebbe essere usato solo per ottenere il nome del file dal percorso del file.
arrt_

74

In Python 3.4+ è possibile utilizzare la pathlibsoluzione

from pathlib import Path

print(Path(your_path).resolve().stem)

4
Perché hai resolve()percorso? È davvero possibile ottenere un percorso per un file senza che il nome del file faccia parte del percorso senza quello? Ciò significa che se si fornisce un percorso al collegamento simbolico, si restituirà il nome file (senza estensione) del file a cui punta il collegamento simbolico.
Boris,

1
Un possibile motivo da utilizzare resolve()è quello di aiutare ad affrontare il problema dei punti multipli. La risposta di seguito sull'utilizzo dell'indice non funzionerà se il percorso è './foo.tar.gz'
William Allcock,

30

https://docs.python.org/3/library/os.path.html

In python 3 pathlib "Il modulo pathlib offre oggetti path di alto livello." così,

>>> from pathlib import Path
>>> p = Path("/a/b/c.txt")
>>> print(p.with_suffix(''))
\a\b\c
>>> print(p.stem)
c

1
Questa è la migliore soluzione python 3 per il caso generico di rimozione dell'estensione da un percorso completo. L'uso di stem rimuove anche il percorso principale. Nel caso ti aspetti una doppia estensione (come bla.tar.gz), puoi anche usarla due volte: p.with_suffix (''). With_suffix ('').
Eelco van Vliet,

24

Se vuoi mantenere il percorso del file e rimuovi l'estensione

>>> file = '/root/dir/sub.exten/file.data.1.2.dat'
>>> print ('.').join(file.split('.')[:-1])
/root/dir/sub.exten/file.data.1.2

16
Se vuoi dividere l'ultimo periodo, usa rsplit:'/root/dir/sub.exten/file.data.1.2.dat'.rsplit('.', 1)
IceArdor

21

os.path.splitext () non funzionerà se ci sono più punti nell'estensione.

Ad esempio, 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

Puoi semplicemente trovare l'indice del primo punto nel nome base e quindi tagliare il nome base per ottenere solo il nome file senza estensione.

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

1
index_of_dot = nome_file.index ('.') Questo verrà fatto dopo aver ottenuto il nome di base del file in modo che non si divida in .env
Dheeraj Chakravarthi,

2
Punto importante, poiché una serie di estensioni come questa è comune. .tar.gz .tar.bz .tar.7z

2
Nota che 'haystack'.index('needle')genera un'eccezione ValueError se l'ago (nel caso sopra il punto, .) non viene trovato nel pagliaio. Esistono anche file senza alcuna estensione.
Cecologia

15

@ IceAdor si riferisce a rsplit in un commento alla soluzione di @ user2902201. rsplit è la soluzione più semplice che supporta più periodi.

Qui è scritto:

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

la mia relazione


13

Ma anche quando importare SO, non riesco a chiamarlo path.basename. È possibile chiamarlo direttamente come basename?

import ose quindi utilizzare os.path.basename

importing osnon significa che è possibile utilizzare os.foosenza fare riferimento a os.


1
sebbene se volessi chiamare direttamente foo potresti usare from os import foo.
Tgray,

hai una versione molto non standard del osmodulo se ha un membro chiamato foo.
Tadhg McDonald-Jensen,

2
È un nome segnaposto. (ad es. considerare patho walk).
Devin Jeanpierre,

13

Ho pensato di aggiungere una variazione all'uso di os.path.splitext senza la necessità di utilizzare l'indicizzazione dell'array.

La funzione restituisce sempre una (root, ext)coppia, quindi è sicuro da usare:

root, ext = os.path.splitext(path)

Esempio:

>>> import os
>>> path = 'my_text_file.txt'
>>> root, ext = os.path.splitext(path)
>>> root
'my_text_file'
>>> ext
'.txt'

os.path.splittext () è la versione
3.6+

6

Gli altri metodi non rimuovono più estensioni. Alcuni hanno anche problemi con nomi di file che non hanno estensioni. Questo frammento si occupa di entrambe le istanze e funziona sia in Python 2 che in 3. Prende il nome base dal percorso, divide il valore su punti e restituisce il primo che è la parte iniziale del nome file.

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

Ecco una serie di esempi da eseguire:

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))

In ogni caso, il valore stampato è:

FileName

Tranne il valore aggiunto della gestione di più punti, questo metodo è molto più veloce di Path('/path/to/file.txt').stem. (1,23μs vs 8,39μs)
raratiru

Questo non funziona con il nome file nvdcve-1.1-2002.json.zip
Michele

L'ho diviso su fileBasename.split ('. Json') [0] e ha funzionato
Michele

4

import os

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

Questo restituisce il filenamesenza extension(C: \ Users \ Public \ Videos \ Sample Videos \ wildlife)

temp = os.path.splitext(filename)[0]  

Ora puoi ottenere solo filenamedal temp con

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

3

Una procedura con estensione multipla. Funziona per stre unicodepercorsi. Funziona in 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'

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

0

Sul sistema Windows ho usato anche il prefisso drivername, come:

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

Quindi, poiché non ho bisogno della lettera di unità o del nome della directory, utilizzo:

>>> print(os.path.splitext(os.path.basename(s))[0])
akarmi

0

Per comodità, una semplice funzione che avvolge i due metodi da 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

Testato con Python 3.5.


0

il modo più semplice per risolvere questo è

import ntpath 
print('Base name is ',ntpath.basename('/path/to/the/file/'))

questo consente di risparmiare tempo e costi di calcolo.


0

Molto molto molto semplicemente nessun altro modulo !!!

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)

-1

Potremmo fare un po 'di magia split/ semplice popcome visto qui ( https://stackoverflow.com/a/424006/1250044 ), per estrarre il nome del file (rispettando le differenze di Windows 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

os.path.splitext () [0] fa la stessa cosa.
Charles Plager,

@CharlesPlager os.path.splitext () non funzionerà se ci sono più punti nell'estensione. stackoverflow.com/a/37760212/1250044
yckart

Funziona per me: In [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

-3

import os nomefile, estensione_file = os.path.splitext ('/ d1 / d2 / example.cs') il nomefile è '/ d1 / d2 / esempio' estensione_file è '.cs'

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.