Python'da bir yolun sadece son kısmını nasıl alabilirim?


233

Python, varsayalım ki böyle bir yol var:

/folderA/folderB/folderC/folderD/

Nasıl bir folderDrol alabilirim ?

Yanıtlar:


389

Kullanın os.path.normpath, sonra os.path.basename:

>>> os.path.basename(os.path.normpath('/folderA/folderB/folderC/folderD/'))
'folderD'

Birincisi sondaki eğik çizgileri keser, ikincisi size yolun son bölümünü verir. Kullanmak, sadece basenamebu durumda olan son eğik çizgiden sonra her şeyi verir ''.


1
Başlangıçta rstrip('/')daha basit olacağını düşündüm ama sonra hemen kullanmak zorunda olduğumu fark ettim rstrip(os.path.sep), bu yüzden açıkça kullanımı normpathhaklı.
Erik Kaplun

Bu, Windows uzun yollar, örneğin, çalışma görünmüyor '\\\\?\\D:\\A\\B\\C\\'ve '\\\\?\\UNC\\svr\\B\\C\\'(getiriler boş dize) Bu çözüm, tüm durumlar için çalışır.
omasoud

25

Yapabilirsin

>>> import os
>>> os.path.basename('/folderA/folderB/folderC/folderD')

GÜNCELLEME1: Bu yaklaşım /folderA/folderB/folderC/folderD/xx.py vermeniz durumunda işe yarar. Bu temel adı xx.py verir. Sanırım istediğin bu değil. Böylece bunu yapabilirsiniz -

>>> import os
>>> path = "/folderA/folderB/folderC/folderD"
>>> if os.path.isdir(path):
        dirname = os.path.basename(path)

GÜNCELLEME2: Larilerin işaret ettiği gibi, '/' sonunu alacak şekilde değişiklikler yapmak.

>>> from os.path import normpath, basename
>>> basename(normpath('/folderA/folderB/folderC/folderD/'))
'folderD'

Python-think'da os.path.basename ("... /") doğru sonuç verir ''. Evet, ben de, bunu en uygun bulmuyorum. Yine de ... temel adı (... normpath ... çözümü kanoniktir.
Cameron Laird

@lars evet! sadece bu durumda temel adı ile beslemeden önce yolu normalleştirdiğini gördüm. os.path.basename (os.path.normpath ('/ klasörA / klasörB / klasörC / klasörD /'))
Srikar Appalaraju

UPDATE2, şimdiye kadar bulduğum en iyi yaklaşım.
akki

23

Python 3 ile pathlibmodülü kullanabilirsiniz ( pathlib.PurePathörneğin):

>>> import pathlib

>>> path = pathlib.PurePath('/folderA/folderB/folderC/folderD/')
>>> path.name
'folderD'

Bir dosyanın bulunduğu son klasör adını istiyorsanız:

>>> path = pathlib.PurePath('/folderA/folderB/folderC/folderD/file.py')
>>> path.parent.name
'folderD'

18

İşte yaklaşımım:

>>> import os
>>> print os.path.basename(
        os.path.dirname('/folderA/folderB/folderC/folderD/test.py'))
folderD
>>> print os.path.basename(
        os.path.dirname('/folderA/folderB/folderC/folderD/'))
folderD
>>> print os.path.basename(
        os.path.dirname('/folderA/folderB/folderC/folderD'))
folderC

1
Yaklaşımınız yukarıda belirtilenlerden farklı / daha iyi neyi çözüyor?
user1767754

9

Dosyanın bulunduğu son kat adını almak için bir çözüm arıyordum, sadece splitiki kez kullandım , doğru parçayı elde etmek için. Bu bir soru değil ama google beni buraya aktardı.

pathname = "/folderA/folderB/folderC/folderD/filename.py"
head, tail = os.path.split(os.path.split(pathname)[0])
print(head + "   "  + tail)

2

Saf bir çözüm (Python 2.5.2+):

s="/path/to/any/folder/orfile"
desired_dir_or_file = s[s.rindex('/',0,-1)+1:-1] if s.endswith('/') else s[s.rindex('/')+1:]

neden kimse bunu kullansın ki?
Chris_Rands

1

Bunun için Path parça yöntemi seviyorum :

grandparent_directory, parent_directory, filename = Path(export_filename).parts[-3:]
log.info(f'{t: <30}: {num_rows: >7} Rows exported to {grandparent_directory}/{parent_directory}/{filename}')


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.