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?

pepero
sumber

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 ''.

Fred Foo
sumber
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'
Srikar Appalaraju
sumber
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'
jinlao
sumber
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
Mike Mitterer
sumber
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)
pengguna1767754
sumber
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:]
mshsayem
sumber
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}')
Andrew Magerman
sumber
0
path = "/folderA/folderB/folderC/folderD/"
last = path.split('/').pop()
GSto
sumber
10
Serius, gunakan os.pathmodul.
Memiliki QUIT - Anony-Mousse
0
str = "/folderA/folderB/folderC/folderD/"
print str.split("/")[-2]
Andrew Sledge
sumber
dia ingin folderD. notfolderC
Srikar Appalaraju
1
Ini memberikan "folderD" karena garis miring membuat item terakhir dalam daftar menjadi ""
neil
21
Serius, gunakan os.pathmodul.
Memiliki QUIT - Anony-Mousse