Bagaimana cara mendapatkan hanya bagian terakhir dari jalur dengan Python?


233

Dengan Python, misalkan saya memiliki jalur seperti ini:

/folderA/folderB/folderC/folderD/

Bagaimana saya bisa mendapatkan folderDbagiannya saja?

Jawaban:


389

Gunakan os.path.normpath, lalu os.path.basename:

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

Strip pertama dari setiap garis miring, yang kedua memberi Anda bagian terakhir dari jalan. Menggunakan hanya basenamememberikan segalanya setelah slash terakhir, yang dalam hal ini adalah ''.


1
Awalnya saya pikir rstrip('/')akan lebih sederhana tetapi kemudian dengan cepat menyadari bahwa saya harus menggunakan rstrip(os.path.sep), jadi jelas penggunaan normpathdibenarkan.
Erik Kaplun

Tampaknya ini tidak berfungsi pada jalur panjang Windows, misalnya, '\\\\?\\D:\\A\\B\\C\\'dan '\\\\?\\UNC\\svr\\B\\C\\'(mengembalikan string kosong) Solusi ini berfungsi untuk semua kasus.
omasoud

25

Anda bisa melakukannya

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

UPDATE1: Pendekatan ini berfungsi jika Anda memberikan /folderA/folderB/folderC/folderD/xx.py. Ini memberikan xx.py sebagai nama dasarnya. Kurasa itu bukan yang kau inginkan. Jadi Anda bisa melakukan ini -

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

UPDATE2: Seperti yang ditunjukkan oleh lars, lakukan perubahan untuk mengakomodasi trailing '/'.

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

Dalam Python-think, os.path.basename ("... /") dengan benar menghasilkan ''. Ya, saya juga menemukan bahwa sub-optimal. The ... basename (... normpath ... solusi di bawah ini kanonik
Cameron Laird

@ lars ya! hanya melihat bahwa dalam kasus itu menormalkan jalan terlebih dahulu sebelum memberinya nama dasar. os.path.basename (os.path.normpath ('/ folderA / folderB / folderC / folderD /'))
Srikar Appalaraju

UPDATE2 adalah pendekatan terbaik yang saya temukan sejauh ini.
akki

23

Dengan python 3 Anda dapat menggunakan pathlibmodul ( pathlib.PurePathmisalnya):

>>> import pathlib

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

Jika Anda ingin nama folder terakhir tempat file berada:

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

18

Inilah pendekatan saya:

>>> 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
Apa pendekatan Anda memecahkan berbeda / lebih baik dari yang disebutkan di atas?
user1767754

9

Saya sedang mencari solusi untuk mendapatkan foldername terakhir di mana file itu berada, saya hanya menggunakan splitdua kali, untuk mendapatkan bagian yang tepat. Ini bukan pertanyaannya tetapi google memindahkan saya ke sini.

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

2

Solusi naif (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:]

mengapa ada orang yang menggunakan ini?
Chris_Rands

1

Saya suka metode bagian Path untuk ini:

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}')


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.