koddla

Yazılımcıları bilgi ile güçlendirir.

Python’da uzantı olmadan dosya adı nasıl elde edilir?

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

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Back to top