วิธีรับเฉพาะส่วนสุดท้ายของเส้นทางใน Python อย่างไร


คำตอบ:


389

ใช้os.path.normpathแล้วos.path.basename:

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

แถบแรกจะตัดเครื่องหมายสแลชใด ๆ ส่วนที่สองให้ส่วนสุดท้ายของเส้นทาง โดยใช้เพียงจะช่วยให้ทุกอย่างหลังจากเฉือนที่ผ่านมาซึ่งในกรณีนี้คือbasename''


1
ผมเริ่มคิดว่าrstrip('/')จะง่าย แต่แล้วรู้อย่างรวดเร็วฉันต้องใช้rstrip(os.path.sep)เพื่อให้เห็นได้ชัดว่าการใช้งานของnormpathเป็นธรรม
Erik Kaplun

ดูเหมือนว่านี่จะไม่ทำงานบนเส้นทางยาวของ Windows เช่น'\\\\?\\D:\\A\\B\\C\\'และ'\\\\?\\UNC\\svr\\B\\C\\'(ส่งคืนสตริงว่าง) โซลูชันนี้ใช้ได้กับทุกกรณี
omasoud

25

คุณสามารถทำได้

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

UPDATE1:วิธีการนี้ใช้งานได้ในกรณีที่คุณให้ /folderA/folderB/folderC/folderD/xx.py สิ่งนี้ให้ xx.py เป็นชื่อฐาน ซึ่งไม่ใช่สิ่งที่คุณต้องการฉันเดา ดังนั้นคุณสามารถทำสิ่งนี้ -

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

UPDATE2:เมื่อลาร์สชี้ให้เห็นการเปลี่ยนแปลงเพื่อรองรับการติดตาม '/'

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

ใน Python-think, os.path.basename ("... /") ให้ผลที่ถูกต้อง '' ใช่ฉันเองก็พบว่าสิ่งที่ดีที่สุดย่อย The ... basename ( ... normpath ... แก้ปัญหาด้านล่างเป็นที่ยอมรับแม้ว่า.
คาเมรอนเจ้าของที่ดิน

@ ลาร์ใช่แล้ว! เพิ่งเห็นว่าในกรณีนั้นทำให้เส้นทางเป็นปกติก่อนที่จะให้อาหารมันเป็นฐาน os.path.basename (os.path.normpath ('/ folderA / folderB / folderC / folderD /'))
Srikar Appalaraju

UPDATE2 เป็นวิธีที่ดีที่สุดที่ฉันค้นพบ
akki

23

ด้วย python 3 คุณสามารถใช้pathlibโมดูล ( pathlib.PurePathตัวอย่าง):

>>> import pathlib

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

หากคุณต้องการชื่อโฟลเดอร์สุดท้ายที่มีไฟล์อยู่:

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

18

นี่คือแนวทางของฉัน:

>>> 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
วิธีการของคุณแก้ไขอะไรแตกต่าง / ดีกว่าดังกล่าว
user1767754

9

ฉันค้นหาวิธีแก้ไขเพื่อให้ได้ชื่อนามสกุลสุดท้ายที่ไฟล์นั้นตั้งอยู่ฉันเพิ่งใช้splitสองครั้งเพื่อให้ได้ส่วนที่ถูกต้อง มันไม่ใช่คำถาม แต่ google โอนฉันมาที่นี่

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

2

โซลูชันไร้เดียงสา (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:]

ทำไมทุกคนจะใช้สิ่งนี้?
Chris_Rands

1

ฉันชอบวิธีส่วนของ Path สำหรับสิ่งนี้:

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


0
str = "/folderA/folderB/folderC/folderD/"
print str.split("/")[-2]

folderDเขาต้องการ ไม่ใช่folderC
Srikar Appalaraju

1
มันให้ "folderD" เพราะเครื่องหมายสแลชต่อท้ายทำให้ไอเท็มสุดท้ายในรายการเป็น ""
neil

21
ใช้os.pathโมดูลอย่างจริงจัง
มี QUIT - Anony-Mousse
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.