Làm thế nào để chỉ lấy phần cuối của một đường dẫn trong Python?


233

Trong Python, giả sử tôi có một đường dẫn như thế này:

/folderA/folderB/folderC/folderD/

Làm thế nào tôi có thể nhận được folderDmột phần?

Câu trả lời:


389

Sử dụng os.path.normpath, sau đó os.path.basename:

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

Các dải đầu tiên loại bỏ bất kỳ dấu gạch chéo, thứ hai cung cấp cho bạn phần cuối của đường dẫn. Sử dụng chỉ basenamecung cấp cho tất cả mọi thứ sau dấu gạch chéo cuối cùng, trong trường hợp này là ''.


1
Ban đầu tôi nghĩ rstrip('/')sẽ đơn giản hơn nhưng sau đó nhanh chóng nhận ra mình phải sử dụng rstrip(os.path.sep), nên rõ ràng việc sử dụng normpathlà hợp lý.
Erik Kaplun

Điều này dường như không hoạt động trên các đường dẫn dài của Windows, ví dụ, '\\\\?\\D:\\A\\B\\C\\''\\\\?\\UNC\\svr\\B\\C\\'(trả về một chuỗi trống) Giải pháp này hoạt động cho tất cả các trường hợp.
omasoud

25

Bạn có thể làm

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

CẬP NHẬT1: Cách tiếp cận này hoạt động trong trường hợp bạn cung cấp cho nó /folderA/folderB/folderC/folderD/xx.py. Điều này cung cấp cho xx.py làm tên cơ sở. Đó không phải là những gì bạn muốn tôi đoán. Vì vậy, bạn có thể làm điều này -

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

CẬP NHẬT2: Như những người nói dối đã chỉ ra, thực hiện các thay đổi để phù hợp với dấu vết '/'.

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

Trong Python-think, os.path.basename ("... /") mang lại chính xác ''. Vâng, tôi cũng vậy, thấy rằng tối ưu phụ. Mặc dù vậy, ... tên cơ sở (... Normpath ... bên dưới là hợp quy.
Cameron Laird

@lars yeah! chỉ thấy rằng trong trường hợp đó, bình thường hóa đường dẫn trước khi đưa nó vào tên cơ sở. os.path.basename (os.path.normpath ('/ thư mụcA / thư mụcB / thư mụcC / thư mụcD /'))
Srikar Appalaraju

UPDATE2 là cách tiếp cận tốt nhất mà tôi đã tìm thấy cho đến nay.
akki

23

Với python 3, bạn có thể sử dụng pathlibmô-đun ( pathlib.PurePathví dụ):

>>> import pathlib

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

Nếu bạn muốn tên thư mục cuối cùng chứa tệp:

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

18

Đây là cách tiếp cận của tôi:

>>> 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
Cách tiếp cận của bạn giải quyết khác nhau / tốt hơn so với những gì đã nói ở trên?
dùng1767754

9

Tôi đã tìm kiếm một giải pháp để có được tên người dùng cuối cùng trong đó tập tin được đặt, tôi chỉ sử dụng splithai lần, để có được phần đúng. Đó không phải là câu hỏi nhưng google đã chuyển tôi ở đây.

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

2

Một giải pháp ngây thơ (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:]

Tại sao mọi người sẽ sử dụng điều này?
Chris_Rands

1

Tôi thích phương thức phần của Path cho việc này:

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


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.