2009-03-24 23 views

risposta

719

Ottenere il nome del file senza l'estensione:

import os 
print(os.path.splitext("path_to_file")[0]) 

Per quanto riguarda il problema di importazione, si risolve in questo modo:

from os.path import basename 

# now you can call it directly with basename 
print(basename("https://stackoverflow.com/a/b/c.txt")) 
+1

v'è alcun motivo per farlo. È essenzialmente un no-op-- se vuoi illustrare l'importazione con un nuovo nome, in realtà lo importa con un nuovo nome.importare foo come foo è solo inutile. –

+1

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

+7

E se il nome del file contiene più punti? – matteok

8

Ma anche quando ho importare os, ho non sono in grado di chiamarlo path.basename. È possibile chiamarlo direttamente come basename?

import os, e quindi utilizzare os.path.basename

import ing os non significa che è possibile utilizzare os.foo senza fare riferimento a os.

+1

sebbene se volessi chiamare foo direttamente potresti usare' da os import foo'. – tgray

+0

si ha una versione non standard del modulo 'os' se ha un membro chiamato' foo'. –

+1

È un nome segnaposto. (ad esempio, considera 'path', o' walk'). –

242

Proprio lo rotolo:

>>> 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' 
+0

os.path.basename sembra più bello e compatto di un'importazione seguito dalla chiamata al basename. –

+2

@ScottWilson: è comunque necessario importare 'os'. – LarsH

+13

Cosa significa "roll it"? – LarsH

127
>>> print os.path.splitext(os.path.basename("hemanth.txt"))[0] 
hemanth 
+4

+1 per questo. 3 stesse risposte esatte, ma questa è la più diretta. Potresti aver usato '\' 'per mostrare il codice, e" /somepath/hermanth.txt "come istanza di percorso. – cregox

+0

Grazie, ho aggiunto il '' ma non so davvero perché il codice non è stato evidenziato! –

+0

@ hemanth.hm Sfortunatamente '' non evidenzia il codice, ed è solo una riga. Ecco perché è scoraggiato dall'utilizzare le risposte quando si utilizzano frammenti di codice di grandi dimensioni e non sono allineati su di essi. – Gustavo6046

2

di sistema in Windows ho usato drivername prefisso pure, come:

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

Quindi, perché non ho bisogno di lettera di unità o il nome della directory, I utilizzare:

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

Se si desidera mantenere t ha percorso del file e basta rimuovere 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 
+12

Se si desidera dividere sull'ultimo periodo, utilizzare rsplit: ''/root/dir/sub.exten/file.data.1.2.dat'.rsplit ('. ', 1)' – IceArdor

1

Potremmo fare qualche semplice magia split/pop come si vede qui (https://stackoverflow.com/a/424006/1250044), per estrarre il nome del file (rispettando le finestre e le differenze 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 
+0

os.path.splitext () [0] fa la stessa cosa. –

+0

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

+0

Funziona per me: In [72] : os.path.splitext ('one.two.three.ext') Out [72]: ('one.two.three', '.ext') –

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

os.path.splitext() non sarà lavoro se ci sono più punti in estensione.

Per 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 

Si può solo trovare l'indice del primo punto nel nome base e poi affettare il basename per ottenere solo il nome del 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 
+0

index_of_dot = file_name.index ('.') Questo sarà essere fatto dopo aver ottenuto il nome base del file in modo che non divida in .env –

+1

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

0

Per comodità, una semplice funzione avvolgendo 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.

3

import os

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

Questa operazione riporta la filename senza il extension (C: \ Users \ Public \ Video \ Sample Video \ fauna selvatica)

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

Ora si può ottenere solo il filename dalla temp con

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

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

Qui è spiegato:

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

my.report

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

Funziona al 100% Copia il codice e incolla quindi cambia il tuo percorso –

14

Per completezza, ecco la soluzione pathlib per Python 3.2+:

from pathlib import Path 

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

A multipla procedura di estensione consapevole. Funziona per i percorsi str e unicode. 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' 
0

il modo più semplice per risolvere questo è quello di

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

questo consente di risparmiare tempo e costi di calcolo.

6

Una versione leggibile, utilizzando Pathlib in Python 3.4+

from pathlib import Path 

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

stamperà:

file di

Se il percorso può essere un collegamento simbolico, quindi aggiungere resolve()

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

Pensavo di introdurre una variante all'uso di os.path.splitext senza la necessità di utilizzare l'indicizzazione degli array.

la funzione restituisce sempre un paio (root, ext) 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' 
Problemi correlati