Python’daki bir dosya yolundan uzantıyı çıkartıp dosya adı elde etmeye çalışalım. Mesela, dosya adresimiz "/path/to/some/file.txt"
olsaydı "file"
‘ı nasıl seçerdik?
Bunun için os modülünü kullanabiliriz. Os modülü ile uzantı olmadan dosyanın adını aşağıdaki gibi alırız:
import os
print(os.path.splitext("/path/to/some/file.txt")[0])
Çıktı:
/path/to/some/file
Os.path.splitext
için Python belgelere bakmayı ihmal etmeyin.
Dosya adı birden çok nokta içeriyorsa, splitext, yalnızca son uzantıyı kaldırır. Mesela:
import os
print(os.path.splitext("/path/to/some/file.txt.zip.asc")[0])
Çıktı:
/path/to/some/file.txt.zip
Aslında bu tam olarak istediğimiz şeydir.
Peki os modülündeki splittext metodu yerine standart split() metodunu kullanamaz mıydık?
Eğer dosya adının nasıl olacağından eminseniz, muhtemelen bir problemle karşılaşmazsınız. Ancak bir çok farklı türde işletim sisteminin bulunduğunu da unutmayın. Bu neden önemli? Çünkü farklı işletim sistemleri dosya işlemlerini farklı yapacaktır. Örneğin, Mac’te dosya uzantıları Linux’takinden farklı olabilir.
Örneğin, /directory.ext/file
gibi bir dosya isminde .split('.')
işe yaramayacaktır. Çünkü split ile nokta’dan ayırmaya çalışıyoruz. Ancak dosya ismimizde nokta yok. Ayrıca, klasör isminde nokta var. Bunun haricinde başka bir örneği de slaş karakterini nasıl kullancağımıza verebiliriz. Bazı işletim sistemlerinde düz slaş karakteri klasör ayıracı olarak kullanılırken, bazı işletim sistemlerinde ters slaş tercih eder.
Dolayısıyla, bu gibi durumlarda bir kütüphane kullanmak daha iyi bir yöntem olacaktır. Örneğin, os.path.splitext uzantısı olmayan bir dosyayı parçaladığında durumu doğru bir şekilde analiz eder ve uzantı yerine boş bir string döndürür.
os.path.splitext()
bir demet döndürür:
>>> import os
>>> name_parts = os.path.splitext('data.txt')
>>> name_parts
('data', '.txt')
Bu demeti parçalayabiliriz:
>>> body, ext = name_parts
Böylece:
>>> body
'data'
ve:
>>> ext
'.txt'
Olur. Bu yaptıklarımızı aslında bir adımda da yapabilirdik.
>>> body, ext = os.path.splitext('data.txt')
Python 3.4+ için pathlib önerilir
Python 3.4+ için pathlib
'den .stem
‘i kullanın:
from pathlib import Path
Path('/root/dir/sub/file.ext').stem
Çıktı:
'file'
Dosyanızda birden çok uzantı varsa yalnızca son uzantıyı kaldıracağını unutmayın. Örneğin, stemPath('file.tar.gz').stem
çıktı olarak 'file.tar'
‘ı döndürür.
Python 3’ten itibaren önerilen yol budur.
Birden fazla uzantı varsa
Birden fazla uzantının olduğu durumlar için işimiz bazen daha zor olabilir. Ancak bu gibi durumlar için Pathlib yardımcı metotlar sağlar. İki veya daha az uzantı içeren dosyalarda .stem
ile birlrikte .with_suffix('')
kullanılabilir:
from pathlib import Path
pth = Path('foo/bar/baz.baz/thefile.tar.gz')
fn = pth.with_suffix('').stem
print(fn) # thefile
Çok sayıda uzantı
Eğer ikiden fazla uzantı adı varsa .suffixes
tüm uzantıları görebilir, sonrasında ise bir döngü ile dosya adını öğrenebiliriz
pth = Path('foo/bar/baz/thefile.tar.gz.bz.7zip')
pth.name # 'thefile.tar.gz.bz.7zip'
pth.suffixes # ['.tar', '.gz', '.bz', '.7zip']
Bundan sonra tüm uzantılar üzerinde bir döngü kurup istediğiniz işlemleri yapabilirsiniz:
fn = pth.name
for s in pth.suffixes:
fn = fn.rsplit(s)[0]
print(fn) # thefile
İlk uzantıyı bildiğiniz durumlarda:
Eeğer ilk uzantıyı biliyorsak (mesela .tar
, .tar.gz
, .tar.gz.bz
, vb;) sadece rsplit
ile bilinen uzantıyı kesebiliriz. Sonrasında ilk öğeyi alarak dosya adını öğrenmiş oluruz:
pth = Path('foo/bar/baz.baz/thefile.tar.gz')
fn = pth.name.rsplit('.tar')[0]
print(fn) # thefile