Risposte:
Sì. Utilizzare os.path.splitext
(consultare la documentazione di Python 2.X o la documentazione di Python 3.X ):
>>> import os
>>> filename, file_extension = os.path.splitext('/path/to/somefile.ext')
>>> filename
'/path/to/somefile'
>>> file_extension
'.ext'
A differenza della maggior parte dei tentativi di suddivisione manuale delle stringhe, os.path.splitext
tratterà correttamente /a/b.c/d
come non avere estensione invece di avere estensione .c/d
e tratterà .bashrc
come non avere estensione invece di avere estensione .bashrc
:
>>> os.path.splitext('/a/b.c/d')
('/a/b.c/d', '')
>>> os.path.splitext('.bashrc')
('.bashrc', '')
endswith()
non essere più portatile e divinatorio?
.asd
è davvero l'estensione !! Se ci pensate, foo.tar.gz
è un file compresso con gzip ( .gz
) che sembra essere un file tar ( .tar
). Ma è un file gzip al primo posto. Non mi aspetto che restituisca affatto la doppia estensione.
splittext
. Se farebbero qualsiasi cosa per indicare l'interruzione tra parti di questo nome, sarebbe molto più facile riconoscere che è splitExt
o split_ext
. Sicuramente non posso essere l'unica persona che ha fatto questo errore?
os.path.splitext('somefile.ext')
=> ('somefile', '.ext')
. Sentiti libero di fornire un esempio di contatore reale senza fare riferimento a una libreria di terze parti.
import os.path
extension = os.path.splitext(filename)[1]
import os.path
invece di from os import path
?
from os import path
allora il nome path
viene preso nel tuo ambito locale, anche altri che guardano il codice potrebbero non sapere immediatamente che path è il percorso dal modulo os. Dove se lo usi, import os.path
lo mantiene nello os
spazio dei nomi e ovunque tu faccia la chiamata, le persone sanno che path()
proviene os
immediatamente dal modulo.
_, extension = os.path.splitext(filename)
sia molto più bella.
if check_for_gzip and os.path.splitext(filename)[1] == '.gz':
Novità nella versione 3.4.
import pathlib
print(pathlib.Path('yourPath.example').suffix) # '.example'
Sono sorpreso che nessuno abbia pathlib
ancora menzionato , pathlib
È fantastico!
Se hai bisogno di tutti i suffissi (ad esempio se hai un .tar.gz
), .suffixes
verrà restituito un elenco di essi!
''.join(pathlib.Path('somedir/file.tar.gz').suffixes)
.suffixes[-2:]
per assicurarsi di ottenere solo .tar.gz al massimo.
Un'opzione potrebbe essere la divisione dal punto:
>>> filename = "example.jpeg"
>>> filename.split(".")[-1]
'jpeg'
Nessun errore quando il file non ha estensione:
>>> "filename".split(".")[-1]
'filename'
Ma devi stare attento:
>>> "png".split(".")[-1]
'png' # But file doesn't have an extension
"my.file.name.js".split('.') => ['my','file','name','js]
['file', 'tar', 'gz']
con 'file.tar.gz'.split('.')
vs ['file.tar', 'gz']
con 'file.tar.gz'.rsplit('.', 1)
. sì, potrebbe essere.
Tutte le soluzioni sopra funzionano, ma su Linux ho scoperto che c'è una nuova riga alla fine della stringa di estensione che impedirà il successo delle partite. Aggiungi il strip()
metodo alla fine. Per esempio:
import os.path
extension = os.path.splitext(filename)[1][1:].strip()
[1:]
a dire l' in .splittext(filename)[1][1:]
) - grazie in anticipo
splittext()
(a differenza di quando dividi una stringa usando '.') Include '.' carattere nell'estensione. L'ulteriore [1:]
si sbarazza di esso.
Con splitext ci sono problemi con i file con doppia estensione (ad es. file.tar.gz
, Ecc file.tar.bz2
.)
>>> fileName, fileExtension = os.path.splitext('/path/to/somefile.tar.gz')
>>> fileExtension
'.gz'
ma dovrebbe essere: .tar.gz
Le possibili soluzioni sono qui
gunzip somefile.tar.gz
qual è il nome del file di output?
Anche se è un vecchio argomento, ma mi chiedo perché non ci sia nessuno che menzioni un api di python molto semplice chiamato partizione in questo caso:
per ottenere l'estensione di un determinato percorso assoluto del file, puoi semplicemente digitare:
filepath.rpartition('.')[-1]
esempio:
path = '/home/jersey/remote/data/test.csv'
print path.rpartition('.')[-1]
ti darà: 'csv'
("string before the right-most occurrence of the separator", "the separator itself", "the rest of the string")
. Se non c'è separazione trovato, la tupla restituita sarà: ("", "", "the original string")
.
Sorpreso, questo non è stato ancora menzionato:
import os
fn = '/some/path/a.tar.gz'
basename = os.path.basename(fn) # os independent
Out[] a.tar.gz
base = basename.split('.')[0]
Out[] a
ext = '.'.join(basename.split('.')[1:]) # <-- main part
# if you want a leading '.', and if no result `None`:
ext = '.' + ext if ext else None
Out[] .tar.gz
Benefici:
Come funzione:
def get_extension(filename):
basename = os.path.basename(filename) # os independent
ext = '.'.join(basename.split('.')[1:])
return '.' + ext if ext else None
[-1]
allora.
Puoi usare a split
su a filename
:
f_extns = filename.split(".")
print ("The extension of the file is : " + repr(f_extns[-1]))
Questo non richiede libreria aggiuntiva
Questa è una tecnica di rappresentazione diretta delle stringhe: vedo molte soluzioni menzionate, ma penso che la maggior parte stia guardando la divisione. Split lo fa comunque ad ogni occorrenza di "." . Quello che preferiresti cercare è la partizione.
string = "folder/to_path/filename.ext"
extension = string.rpartition(".")[-1]
Un'altra soluzione con la giusta divisione:
# to get extension only
s = 'test.ext'
if '.' in s: ext = s.rsplit('.', 1)[1]
# or, to get file name and extension
def split_filepath(s):
"""
get filename and extension from filepath
filepath -> (filename, extension)
"""
if not '.' in s: return (s, '')
r = s.rsplit('.', 1)
return (r[0], r[1])
Anche a questa domanda è già stata data risposta Aggiungerei la soluzione in Regex.
>>> import re
>>> file_suffix = ".*(\..*)"
>>> result = re.search(file_suffix, "somefile.ext")
>>> result.group(1)
'.ext'
\.[0-9a-z]+$
come in questo post .
Un vero one-liner, se ti piace regex. E non importa anche se hai "". nel mezzo
import re
file_ext = re.search(r"\.([^.]+)$", filename).group(1)
Vedi qui per il risultato: clicca qui
Questo è il metodo più semplice per ottenere sia il nome file che l'estensione in una sola riga .
fName, ext = 'C:/folder name/Flower.jpeg'.split('/')[-1].split('.')
>>> print(fName)
Flower
>>> print(ext)
jpeg
A differenza di altre soluzioni, non è necessario importare alcun pacchetto per questo.
Per i più divertenti ... basta raccogliere le estensioni in un dict e tracciarle tutte in una cartella. Quindi basta estrarre le estensioni desiderate.
import os
search = {}
for f in os.listdir(os.getcwd()):
fn, fe = os.path.splitext(f)
try:
search[fe].append(f)
except:
search[fe]=[f,]
extensions = ('.png','.jpg')
for ex in extensions:
found = search.get(ex,'')
if found:
print(found)
prova questo:
files = ['file.jpeg','file.tar.gz','file.png','file.foo.bar','file.etc']
pen_ext = ['foo', 'tar', 'bar', 'etc']
for file in files: #1
if (file.split(".")[-2] in pen_ext): #2
ext = file.split(".")[-2]+"."+file.split(".")[-1]#3
else:
ext = file.split(".")[-1] #4
print (ext) #5
foo.tar
è un nome file valido. Cosa succede se lo lancio al tuo codice? Che dire di .bashrc
o foo
? C'è una funzione di libreria per questo per un motivo ...
# try this, it works for anything, any length of extension
# e.g www.google.com/downloads/file1.gz.rs -> .gz.rs
import os.path
class LinkChecker:
@staticmethod
def get_link_extension(link: str)->str:
if link is None or link == "":
return ""
else:
paths = os.path.splitext(link)
ext = paths[1]
new_link = paths[0]
if ext != "":
return LinkChecker.get_link_extension(new_link) + ext
else:
return ""
def NewFileName(fichier):
cpt = 0
fic , *ext = fichier.split('.')
ext = '.'.join(ext)
while os.path.isfile(fichier):
cpt += 1
fichier = '{0}-({1}).{2}'.format(fic, cpt, ext)
return fichier
name_only=file_name[:filename.index(".")
Questo ti darà il nome del file fino al primo ".", Che sarebbe il più comune.
file.name.ext
basename
è un po 'confuso da quandoos.path.basename("/path/to/somefile.ext")
sarebbe tornato"somefile.ext"