Jawaban:
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', '')
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 adalah splitExt
atau split_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.
import os.path
extension = os.path.splitext(filename)[1]
import os.path
bukan from os import path
?
from os import path
maka nama path
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 menggunakannya import os.path
menyimpannya dalam os
namespace dan di mana pun Anda membuat panggilan, orang tahu itu path()
dari os
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.
import pathlib
print(pathlib.Path('yourPath.example').suffix) # '.example'
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 !
''.join(pathlib.Path('somedir/file.tar.gz').suffixes)
.suffixes[-2:]
untuk memastikan hanya mendapatkan .tar.gz paling banyak.
Satu opsi mungkin terpisah dari titik:
>>> filename = "example.jpeg"
>>> filename.split(".")[-1]
'jpeg'
Tidak ada kesalahan saat file tidak memiliki ekstensi:
>>> "filename".split(".")[-1]
'filename'
Tetapi Anda harus berhati-hati:
>>> "png".split(".")[-1]
'png' # But file doesn't have an extension
"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.
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:
import os.path
extension = os.path.splitext(filename)[1][1:].strip()
[1:]
in .splittext(filename)[1][1:]
) - terima kasih sebelumnya
splittext()
(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.)
>>> fileName, fileExtension = os.path.splitext('/path/to/somefile.tar.gz')
>>> fileExtension
'.gz'
tetapi harus: .tar.gz
Solusi yang mungkin ada di sini
gunzip somefile.tar.gz
apa nama file keluaran?
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:
filepath.rpartition('.')[-1]
contoh:
path = '/home/jersey/remote/data/test.csv'
print path.rpartition('.')[-1]
akan memberi Anda: 'csv'
("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")
.
Terkejut ini belum disebutkan:
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
Manfaat:
Sebagai fungsi:
def get_extension(filename):
basename = os.path.basename(filename) # os independent
ext = '.'.join(basename.split('.')[1:])
return '.' + ext if ext else None
[-1]
saat itu.
Anda dapat menggunakan split
pada filename
:
f_extns = filename.split(".")
print ("The extension of the file is : " + repr(f_extns[-1]))
Ini tidak memerlukan perpustakaan tambahan
filename='ext.tar.gz'
extension = filename[filename.rfind('.'):]
filename
yang dikembalikan jika nama file tidak ada .
sama sekali. Ini karena rfind
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.
string = "folder/to_path/filename.ext"
extension = string.rpartition(".")[-1]
Solusi lain dengan split kanan:
# 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])
Bahkan pertanyaan ini sudah dijawab Saya akan menambahkan solusinya di Regex.
>>> import re
>>> file_suffix = ".*(\..*)"
>>> result = re.search(file_suffix, "somefile.ext")
>>> result.group(1)
'.ext'
\.[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
import re
file_ext = re.search(r"\.([^.]+)$", filename).group(1)
Lihat di sini untuk hasilnya: Klik Di Sini
Ini adalah Metode Sederhana untuk mendapatkan Nama File & Ekstensi hanya dalam satu baris .
fName, ext = 'C:/folder name/Flower.jpeg'.split('/')[-1].split('.')
>>> print(fName)
Flower
>>> print(ext)
jpeg
Tidak seperti solusi lain, Anda tidak perlu mengimpor paket apa pun untuk ini.
Untuk funsies ... kumpulkan saja ekstensi dalam dict, dan lacak semuanya dalam folder. Kemudian cukup tarik ekstensi yang Anda inginkan.
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)
coba ini:
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
adalah nama file yang valid. Apa yang terjadi jika saya melemparkan itu pada kode Anda? Bagaimana dengan .bashrc
atau foo
? Ada fungsi perpustakaan untuk ini karena suatu alasan ...
# 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(".")
Itu akan memberi Anda nama file hingga yang pertama ".", Yang akan menjadi yang paling umum.
file.name.ext
basename
sedikit membingungkan di sini karenaos.path.basename("/path/to/somefile.ext")
akan kembali"somefile.ext"