Yanıtlar:
Evet. Kullanım os.path.splitext(bkz. Python 2.X belgeleri veya Python 3.X belgeleri ):
>>> import os
>>> filename, file_extension = os.path.splitext('/path/to/somefile.ext')
>>> filename
'/path/to/somefile'
>>> file_extension
'.ext'
En kılavuzu dizisi bölme girişimi farklı olarak, os.path.splitextdoğru bir şekilde tedavi edecek /a/b.c/dbir uzantısı olan yerine uzantısına sahip olarak .c/dve bu tedavi edecek .bashrcyerine sahip olan uzantısının bir uzantısı sahip olarak .bashrc:
>>> os.path.splitext('/a/b.c/d')
('/a/b.c/d', '')
>>> os.path.splitext('.bashrc')
('.bashrc', '')
endswith()daha taşınabilir ve pythonic olamaz?
.asdgerçekten uzantısı !! Bu konuda düşünüyorsanız, foo.tar.gzbir olan gzip-sıkıştırılmış dosya ( .gzbir olur) tar dosyasını ( .tar). Ama ilk etapta bir gzip dosyası . Çift uzantıyı geri döndürmesini hiç beklemezdim.
splittext. Onlar sadece bu isim parçaları arasındaki mola belirtmek için her şeyi yaparım, o öyle olduğunu kabul etmek daha kolay olurdu splitExtya split_ext. Şüphesiz bu hatayı yapan tek kişi ben olamam?
os.path.splitext('somefile.ext')=> ('somefile', '.ext'). Bazı üçüncü taraf kitaplıklarına başvurmadan gerçek bir karşı örnek sunmaktan çekinmeyin.
import os.path
extension = os.path.splitext(filename)[1]
import os.pathyerine from os import path?
from os import patho zaman ad pathyerel kapsamınıza alınır, ayrıca koda bakan diğerleri yolun os modülünden yol olduğunu hemen bilemeyebilir. Nerede kullanmak sanki import os.patho hapseden osad ve arama yapmak yerde insanlar biliyorum path()dan oshemen modülü.
_, extension = os.path.splitext(filename)daha hoş görüneceğini düşünüyorum .
if check_for_gzip and os.path.splitext(filename)[1] == '.gz':
3.4 sürümündeki yenilikler.
import pathlib
print(pathlib.Path('yourPath.example').suffix) # '.example'
pathlibHenüz kimsenin bahsetmediğine şaşırdım , pathlibharika!
Tüm soneklere ihtiyacınız varsa (örneğin a varsa .tar.gz), .suffixesbunların bir listesini döndürür!
''.join(pathlib.Path('somedir/file.tar.gz').suffixes)
.suffixes[-2:]yalnızca .tar.gz almayı sağlamak için kullanıyor olmalıdır .
Bir seçenek noktadan ayrılıyor olabilir:
>>> filename = "example.jpeg"
>>> filename.split(".")[-1]
'jpeg'
Dosyanın uzantısı yoksa hata yok:
>>> "filename".split(".")[-1]
'filename'
Ancak dikkatli olmalısınız:
>>> "png".split(".")[-1]
'png' # But file doesn't have an extension
"my.file.name.js".split('.') => ['my','file','name','js]
['file', 'tar', 'gz']ile 'file.tar.gz'.split('.') vs ['file.tar', 'gz'] ile 'file.tar.gz'.rsplit('.', 1). evet olabilir.
Yukarıdaki çözümlerden herhangi biri çalışır, ancak linux'da uzatma dizesinin sonunda eşleşmelerin başarılı olmasını engelleyecek yeni bir satır olduğunu gördüm. strip()Yöntemi sonuna ekleyin . Örneğin:
import os.path
extension = os.path.splitext(filename)[1][1:].strip()
[1:]içinde .splittext(filename)[1][1:]) - şimdiden teşekkür ederim
splittext()('.' Kullanarak bir dizeyi bölmekten farklı olarak) '.' karakter. Ek [1:]bundan kurtulur.
Splitext ile çift uzantılı dosyalarla sorunlar var (örneğin file.tar.gz, file.tar.bz2vb ..)
>>> fileName, fileExtension = os.path.splitext('/path/to/somefile.tar.gz')
>>> fileExtension
'.gz'
ancak şöyle olmalıdır: .tar.gz
Olası çözümler burada
gunzip somefile.tar.gz çıktı dosya adı nedir?
Eski bir konu olmasına rağmen, neden bu durumda rpartition adlı python'un çok basit bir API'sinden bahsetmediğini merak ediyorum:
belirli bir dosya mutlak yolunun uzantısını almak için şunları yazabilirsiniz:
filepath.rpartition('.')[-1]
misal:
path = '/home/jersey/remote/data/test.csv'
print path.rpartition('.')[-1]
size verecek: 'csv'
("string before the right-most occurrence of the separator", "the separator itself", "the rest of the string"). Bulunamadı ayırıcı varsa, iade tuple olacaktır: ("", "", "the original string").
Şaşırmadım, henüz bahsedilmedi:
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
Yararları:
Fonksiyon olarak:
def get_extension(filename):
basename = os.path.basename(filename) # os independent
ext = '.'.join(basename.split('.')[1:])
return '.' + ext if ext else None
[-1]o zaman değiştirin .
A splitüzerinde şunları kullanabilirsiniz filename:
f_extns = filename.split(".")
print ("The extension of the file is : " + repr(f_extns[-1]))
Bu ek kitaplık gerektirmez
Bu doğrudan bir dize temsil teknikleri: Bahsedilen birçok çözüm görüyorum, ama bence çoğu bölünmeye bakıyor. Ancak Split bunu her "." . Aramak istediğiniz şey bölmedir.
string = "folder/to_path/filename.ext"
extension = string.rpartition(".")[-1]
Doğru bölünmüş başka bir çözüm:
# 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])
Eğer regex isterseniz, gerçek bir tek astar. Ve ek "." Kodunuz olsa bile önemli değil. ortada
import re
file_ext = re.search(r"\.([^.]+)$", filename).group(1)
Sonuç için buraya bakın: Buraya tıklayın
Bu, hem Dosya Adını hem de Uzantıyı tek bir satırda elde etmenin en basit yöntemidir .
fName, ext = 'C:/folder name/Flower.jpeg'.split('/')[-1].split('.')
>>> print(fName)
Flower
>>> print(ext)
jpeg
Diğer çözümlerin aksine, bunun için herhangi bir paket almanıza gerek yoktur.
Eğlenceler için ... uzantıları bir dikte halinde toplayın ve hepsini bir klasörde takip edin. Ardından istediğiniz uzantıları çekin.
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)
bunu dene:
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.targeçerli bir dosya adı. Bunu kodunuza atarsam ne olur? Peki .bashrcya foo? Bunun için bir kütüphane işlevi var ...
# 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(".")
Bu size en yaygın olan ilk "." E kadar dosya adını verecektir.
file.name.ext
basenamebiraz kafa karıştırıcı berios.path.basename("/path/to/somefile.ext")dönecekti"somefile.ext"