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.splitext
doğru bir şekilde tedavi edecek /a/b.c/d
bir uzantısı olan yerine uzantısına sahip olarak .c/d
ve bu tedavi edecek .bashrc
yerine 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?
.asd
gerçekten uzantısı !! Bu konuda düşünüyorsanız, foo.tar.gz
bir olan gzip-sıkıştırılmış dosya ( .gz
bir 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 splitExt
ya 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.path
yerine from os import path
?
from os import path
o zaman ad path
yerel 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.path
o hapseden os
ad ve arama yapmak yerde insanlar biliyorum path()
dan os
hemen 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'
pathlib
Henüz kimsenin bahsetmediğine şaşırdım , pathlib
harika!
Tüm soneklere ihtiyacınız varsa (örneğin a varsa .tar.gz
), .suffixes
bunları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.bz2
vb ..)
>>> 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.tar
geçerli bir dosya adı. Bunu kodunuza atarsam ne olur? Peki .bashrc
ya 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
basename
biraz kafa karıştırıcı berios.path.basename("/path/to/somefile.ext")
dönecekti"somefile.ext"