Nhận tên thư mục của tệp bằng Python


88

Trong Python, tôi nên sử dụng lệnh nào để lấy tên của thư mục chứa tệp mà tôi đang làm việc?

"C:\folder1\folder2\filename.xml"

Đây "folder2"là những gì tôi muốn có được.

Điều duy nhất tôi nghĩ ra là sử dụng os.path.splithai lần:

folderName = os.path.split(os.path.split("C:\folder1\folder2\filename.xml")[0])[1]

Có cách nào tốt hơn để làm điều đó không?


Câu trả lời:


165

Bạn có thể sử dụng dirname:

os.path.dirname(path)

Trả về tên thư mục của đường dẫn tên đường dẫn. Đây là phần tử đầu tiên của cặp được trả về bằng cách truyền đường dẫn đến hàm split ().

Và với đường dẫn đầy đủ, sau đó bạn có thể chia bình thường để lấy phần cuối cùng của đường dẫn. Ví dụ, bằng cách sử dụng basename:

os.path.basename(path)

Trả lại tên cơ sở của đường dẫn tên đường dẫn. Đây là phần tử thứ hai của cặp được trả về bằng cách truyền đường dẫn đến hàm split (). Lưu ý rằng kết quả của hàm này khác với chương trình Unix basename; trong đó basename cho '/ foo / bar /' trả về 'bar', hàm basename () trả về một chuỗi trống ('').


Tất cả cùng nhau:

>>> import os
>>> path=os.path.dirname("C:/folder1/folder2/filename.xml")
>>> path
'C:/folder1/folder2'
>>> os.path.basename(path)
'folder2'

7
Ngoài ra, để có được những phần cuối cùng, bạn có thể sử dụngos.path.basename
mgilson

@mgilson điểm tốt! Đã cập nhật câu trả lời của tôi để phản ánh điều này, cảm ơn rất nhiều
fedorqui 'VẬY đừng làm hại nữa'

17

Bạn đang muốn sử dụng dirname . Nếu bạn chỉ muốn một thư mục đó, bạn có thể sử dụng os.path.basename ,

Khi đặt tất cả lại với nhau, nó trông như thế này:

os.path.basename(os.path.dirname('dir/sub_dir/other_sub_dir/file_name.txt'))

Điều đó sẽ giúp bạn có được "other_sub_dir"

Sau đây không phải là cách tiếp cận lý tưởng, nhưng tôi đã đề xuất ban đầu, sử dụng os.path.split và chỉ cần lấy mục cuối cùng. trông như thế này:

os.path.split(os.path.dirname('dir/sub_dir/other_sub_dir/file_name.txt'))[-1]

5
thay vì chia nhỏ str.split, tốt hơn là nên sử dụng os.path.split(xử lý sự khác biệt của các hệ điều hành khác nhau tốt hơn).
mgilson,

Đúng. Bạn đúng rồi! Trượt đầu óc. Cảm ơn @mgilson
idjaw 27/10/15

9

cái này khá cũ, nhưng nếu bạn đang sử dụng Python 3.4 trở lên, hãy sử dụng PathLib .

# using OS
import os
path=os.path.dirname("C:/folder1/folder2/filename.xml")
print(path)
print(os.path.basename(path))

# using pathlib
import pathlib
path = pathlib.PurePath("C:/folder1/folder2/filename.xml")
print(path.parent)
print(path.parent.name)

8

os.path.dirname là những gì bạn đang tìm kiếm -

os.path.dirname(r"C:\folder1\folder2\filename.xml")

Đảm bảo rằng bạn thêm trước vào rchuỗi để nó được coi là một chuỗi thô.

Bản giới thiệu -

In [46]: os.path.dirname(r"C:\folder1\folder2\filename.xml")
Out[46]: 'C:\\folder1\\folder2'

Nếu bạn chỉ muốn folder2, bạn có thể sử dụng os.path.basenameở trên, Ví dụ -

os.path.basename(os.path.dirname(r"C:\folder1\folder2\filename.xml"))

Bản giới thiệu -

In [48]: os.path.basename(os.path.dirname(r"C:\folder1\folder2\filename.xml"))
Out[48]: 'folder2'

1

Bạn có thể lấy đường dẫn đầy đủ dưới dạng một chuỗi, sau đó chia nó thành một danh sách bằng cách sử dụng ký tự phân cách trong hệ điều hành của bạn. Sau đó, bạn nhận được tên chương trình, tên thư mục, v.v. bằng cách truy cập các phần tử từ cuối danh sách bằng cách sử dụng các chỉ số âm.

Như thế này:

import os
strPath = os.path.realpath(__file__)
print( f"Full Path    :{strPath}" )
nmFolders = strPath.split( os.path.sep )
print( "List of Folders:", nmFolders )
print( f"Program Name :{nmFolders[-1]}" )
print( f"Folder Name  :{nmFolders[-2]}" )
print( f"Folder Parent:{nmFolders[-3]}" )

Kết quả của phần trên là:

Full Path    :C:\Users\terry\Documents\apps\environments\dev\app_02\app_02.py
List of Folders: ['C:', 'Users', 'terry', 'Documents', 'apps', 'environments', 'dev', 'app_02', 'app_02.py']
Program Name :app_02.py
Folder Name  :app_02
Folder Parent:dev

1

bạn có thể sử dụng pathlib

from pathlib import Path
Path(r"C:\folder1\folder2\filename.xml").parts[-2]

Kết quả của phần trên là:

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