Apakah ada fungsi untuk mengekstrak ekstensi dari nama file?
1301
Apakah ada fungsi untuk mengekstrak ekstensi dari nama file?
Iya. Gunakan os.path.splitext
(lihat dokumentasi Python 2.X atau dokumentasi Python 3.X ):
>>> import os
>>> filename, file_extension = os.path.splitext('/path/to/somefile.ext')
>>> filename
'/path/to/somefile'
>>> file_extension
'.ext'
Tidak seperti kebanyakan upaya pemisahan string manual, os.path.splitext
akan memperlakukan dengan benar /a/b.c/d
sebagai tidak memiliki ekstensi alih-alih memiliki ekstensi .c/d
, dan itu akan diperlakukan .bashrc
sebagai tidak memiliki ekstensi alih-alih memiliki ekstensi .bashrc
:
>>> os.path.splitext('/a/b.c/d')
('/a/b.c/d', '')
>>> os.path.splitext('.bashrc')
('.bashrc', '')
basename
sedikit membingungkan di sini karenaos.path.basename("/path/to/somefile.ext")
akan kembali"somefile.ext"
endswith()
tidak lebih portabel dan pythonic?.asd
ini benar-benar ekstensi !! Jika Anda memikirkannya,foo.tar.gz
adalah file terkompresi gzip (.gz
) yang merupakan file tar (.tar
). Tapi itu adalah file gzip di tempat pertama. Saya tidak berharap untuk mengembalikan ekstensi ganda sama sekali.splittext
. Jika mereka hanya melakukan apa saja untuk menandakan jeda antara bagian dari nama ini, akan lebih mudah untuk mengenali bahwa itu adalahsplitExt
atausplit_ext
. Tentunya saya bukan satu-satunya orang yang melakukan kesalahan ini?os.path.splitext('somefile.ext')
=>('somefile', '.ext')
. Jangan ragu memberikan contoh penghitung yang sebenarnya tanpa merujuk beberapa perpustakaan pihak ketiga.sumber
import os.path
bukanfrom os import path
?from os import path
maka namapath
diambil di lingkup lokal Anda, juga orang lain yang melihat kode mungkin tidak segera tahu bahwa path adalah path dari modul os. Di mana seolah-olah Anda menggunakannyaimport os.path
menyimpannya dalamos
namespace dan di mana pun Anda membuat panggilan, orang tahu itupath()
darios
modul segera._, extension = os.path.splitext(filename)
jauh lebih bagus.if check_for_gzip and os.path.splitext(filename)[1] == '.gz':
Baru dalam versi 3.4.
Saya terkejut belum ada yang menyebutkan
pathlib
,pathlib
LUAR BIASA!Jika Anda membutuhkan semua sufiks (mis. Jika Anda memiliki
.tar.gz
),.suffixes
akan mengembalikan daftar sufiks !sumber
''.join(pathlib.Path('somedir/file.tar.gz').suffixes)
.suffixes[-2:]
untuk memastikan hanya mendapatkan .tar.gz paling banyak.Untuk hanya mendapatkan teks ekstensi, tanpa titik.
sumber
Satu opsi mungkin terpisah dari titik:
Tidak ada kesalahan saat file tidak memiliki ekstensi:
Tetapi Anda harus berhati-hati:
sumber
"my.file.name.js".split('.') => ['my','file','name','js]
['file', 'tar', 'gz']
dengan'file.tar.gz'.split('.')
vs['file.tar', 'gz']
dengan'file.tar.gz'.rsplit('.', 1)
. ya, bisa jadi.layak ditambahkan yang lebih rendah di sana sehingga Anda tidak bertanya-tanya mengapa JPG tidak muncul dalam daftar Anda.
sumber
Salah satu solusi di atas berfungsi, tetapi di linux saya telah menemukan bahwa ada baris baru di akhir string ekstensi yang akan mencegah kecocokan dari berhasil. Tambahkan
strip()
metode sampai akhir. Sebagai contoh:sumber
[1:]
in.splittext(filename)[1][1:]
) - terima kasih sebelumnyasplittext()
(tidak seperti jika Anda memisahkan string menggunakan '.') Termasuk '.' karakter dalam ekstensi. Tambahan[1:]
menghilangkannya.Dengan splitext ada masalah dengan file dengan ekstensi ganda (mis
file.tar.gz
.file.tar.bz2
, Dll.)tetapi harus:
.tar.gz
Solusi yang mungkin ada di sini
sumber
gunzip somefile.tar.gz
apa nama file keluaran?Anda dapat menemukan beberapa hal hebat dalam modul pathlib (tersedia dalam python 3.x).
sumber
Meskipun ini adalah topik lama, tetapi saya bertanya-tanya mengapa tidak ada yang menyebutkan api sangat sederhana dari python yang disebut rpartition dalam kasus ini:
untuk mendapatkan ekstensi path absolut file yang diberikan, Anda cukup mengetik:
contoh:
akan memberi Anda: 'csv'
sumber
("string before the right-most occurrence of the separator", "the separator itself", "the rest of the string")
. Jika tidak ada pemisah ditemukan, tupel kembali akan:("", "", "the original string")
.Hanya
join
semuapathlib suffixes
.sumber
Terkejut ini belum disebutkan:
Manfaat:
Sebagai fungsi:
sumber
[-1]
saat itu.Anda dapat menggunakan
split
padafilename
:Ini tidak memerlukan perpustakaan tambahan
sumber
sumber
filename
yang dikembalikan jika nama file tidak ada.
sama sekali. Ini karenarfind
pengembalian-1
jika string tidak ditemukan.Ini adalah teknik representasi string langsung: Saya melihat banyak solusi yang disebutkan, tetapi saya pikir sebagian besar melihat split. Namun Split melakukannya di setiap kemunculan "." . Apa yang Anda lebih suka cari adalah partisi.
sumber
Solusi lain dengan split kanan:
sumber
Bahkan pertanyaan ini sudah dijawab Saya akan menambahkan solusinya di Regex.
sumber
\.[0-9a-z]+$
seperti pada postingan ini .Satu-liner sejati, jika Anda suka regex. Dan tidak masalah bahkan jika Anda memiliki tambahan "." di tengah-tengah
Lihat di sini untuk hasilnya: Klik Di Sini
sumber
Ini adalah Metode Sederhana untuk mendapatkan Nama File & Ekstensi hanya dalam satu baris .
Tidak seperti solusi lain, Anda tidak perlu mengimpor paket apa pun untuk ini.
sumber
Untuk funsies ... kumpulkan saja ekstensi dalam dict, dan lacak semuanya dalam folder. Kemudian cukup tarik ekstensi yang Anda inginkan.
sumber
coba ini:
sumber
foo.tar
adalah nama file yang valid. Apa yang terjadi jika saya melemparkan itu pada kode Anda? Bagaimana dengan.bashrc
ataufoo
? Ada fungsi perpustakaan untuk ini karena suatu alasan ...sumber
sumber
Itu akan memberi Anda nama file hingga yang pertama ".", Yang akan menjadi yang paling umum.
sumber
file.name.ext