Come ottenere il nome file senza l'estensione da un percorso in Python?
Come ottenere il nome file senza l'estensione da un percorso in Python?
Risposte:
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.
splitext('kitty.jpg.zip')
dà ('kitty.jpg', '.zip')
).
splitext(basename('/some/path/to/file.txt'))[0]
( cosa che mi sembra sempre di fare)
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.
os
.
Utilizzo pathlib
in Python 3.4+
from pathlib import Path
Path('/root/dir/sub/file.ext').stem
tornerà
'file'
os.path
soluzioni, questo eliminerà solo un interno (o suffix
, come lo pathlib
chiama). Path('a.b.c').stem == 'a.b'
Path(Path('a.b.c').stem).stem
.with_suffix('')
sia la strada da percorrere. Probabilmente vorrai fare un ciclo fino a quando p.suffix == ''
.
>>> print(os.path.splitext(os.path.basename("hemanth.txt"))[0])
hemanth
`
per mostrare il codice e "/somepath/hermanth.txt" come istanza di percorso.
os.path.basename
non è necessario. os.path.basename
dovrebbe essere usato solo per ottenere il nome del file dal percorso del file.
In Python 3.4+ è possibile utilizzare la pathlib
soluzione
from pathlib import Path
print(Path(your_path).resolve().stem)
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.
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'
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
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
'/root/dir/sub.exten/file.data.1.2.dat'.rsplit('.', 1)
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
'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.
Ma anche quando importare SO, non riesco a 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
.
from os import foo
.
os
modulo se ha un membro chiamato foo
.
path
o walk
).
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'
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
Path('/path/to/file.txt').stem
. (1,23μs vs 8,39μs)
import os
filename = C:\\Users\\Public\\Videos\\Sample Videos\\wildlife.wmv
Questo restituisce il filename
senza extension
(C: \ Users \ Public \ Videos \ Sample Videos \ wildlife)
temp = os.path.splitext(filename)[0]
Ora puoi ottenere solo filename
dal temp con
os.path.basename(temp) #this returns just the filename (wildlife)
Una procedura con estensione multipla. Funziona per str
e unicode
percorsi. 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'
import os
path = "a/b/c/abc.txt"
print os.path.splitext(os.path.basename(path))[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
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.
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.
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)
Potremmo fare un po 'di magia split
/ semplice pop
come 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
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
import os nomefile, estensione_file = os.path.splitext ('/ d1 / d2 / example.cs') il nomefile è '/ d1 / d2 / esempio' estensione_file è '.cs'