Làm cách nào để trích xuất đường dẫn thư mục từ đường dẫn tệp bằng Python?


115

Tôi chỉ muốn lấy đường dẫn thư mục từ đường dẫn đầy đủ đến một tệp.

Ví dụ T:\Data\DBDesign\DBDesign_93_v141b.mdbvà tôi chỉ muốn lấy T:\Data\DBDesign(không bao gồm \DBDesign_93_v141b.mdb).

Tôi đã thử một cái gì đó như thế này:

existGDBPath = r'T:\Data\DBDesign\DBDesign_93_v141b.mdb'
wkspFldr = str(existGDBPath.split('\\')[0:-1])
print wkspFldr 

nhưng nó đã cho tôi một kết quả như thế này:

['T:', 'Data', 'DBDesign']

mà không phải là kết quả mà tôi yêu cầu (hiện hữu T:\Data\DBDesign).

Bất kỳ ý tưởng nào về cách tôi có thể lấy đường dẫn đến tệp của mình?

Câu trả lời:


140

Bạn gần như đã ở đó với việc sử dụng splitchức năng của bạn. Bạn chỉ cần nối các chuỗi, như sau.

>>> import os
>>> '\\'.join(existGDBPath.split('\\')[0:-1])
'T:\\Data\\DBDesign'

Mặc dù, tôi khuyên bạn nên sử dụng os.path.dirnamehàm để làm điều này, bạn chỉ cần chuyển chuỗi và nó sẽ thực hiện công việc cho bạn. Vì dường như bạn đang ở trên windows, hãy cân nhắc sử dụng abspathchức năng này. Một ví dụ:

>>> import os
>>> os.path.dirname(os.path.abspath(existGDBPath))
'T:\\Data\\DBDesign'

Nếu bạn muốn cả tên tệp và đường dẫn thư mục sau khi được tách, bạn có thể sử dụng os.path.splithàm trả về một bộ giá trị, như sau.

>>> import os
>>> os.path.split(os.path.abspath(existGDBPath))
('T:\\Data\\DBDesign', 'DBDesign_93_v141b.mdb')

os.sep.join(existGDBPath.split(os.sep)[:-1]trông đẹp hơn.
Dave Babbitt

88

VỚI MODULE PATHLIB (CÂU TRẢ LỜI CẬP NHẬT)

Người ta nên xem xét sử dụng pathlib để phát triển mới. Nó nằm trong stdlib cho Python3.4, nhưng có sẵn trên PyPI cho các phiên bản trước đó. Thư viện này cung cấp một phương thức chứa nhiều đối tượng hơn để thao tác các đường dẫn <opinion>và dễ đọc và lập trình hơn nhiều </opinion>.

>>> import pathlib
>>> existGDBPath = pathlib.Path(r'T:\Data\DBDesign\DBDesign_93_v141b.mdb')
>>> wkspFldr = existGDBPath.parent
>>> print wkspFldr
Path('T:\Data\DBDesign')

VỚI MODULE OS

Sử dụng mô-đun os.path :

>>> import os
>>> existGDBPath = r'T:\Data\DBDesign\DBDesign_93_v141b.mdb'
>>> wkspFldr = os.path.dirname(existGDBPath)
>>> print wkspFldr 
'T:\Data\DBDesign'

Bạn có thể tiếp tục và giả sử rằng nếu bạn cần thực hiện một số loại thao tác tên tệp, nó đã được thực hiện os.path. Nếu không, bạn vẫn có thể cần sử dụng mô-đun này làm khối xây dựng.


Path().parentnhững gì tôi đang tìm kiếm!
iedmrc

44

Os.path mô-đun con được tích hợp sẵn có một chức năng cho chính nhiệm vụ đó.

import os
os.path.dirname('T:\Data\DBDesign\DBDesign_93_v141b.mdb')

4

Đây là mã:

import os
existGDBPath = r'T:\Data\DBDesign\DBDesign_93_v141b.mdb'
wkspFldr = os.path.dirname(existGDBPath)
print wkspFldr # T:\Data\DBDesign

0

Đây là trình trợ giúp tiện ích nhỏ của tôi để tách đường dẫn int tệp, mã thông báo đường dẫn:

import os    
# usage: file, path = splitPath(s)
def splitPath(s):
    f = os.path.basename(s)
    p = s[:-(len(f))-1]
    return f, p

0

Bất kỳ ai đang cố gắng thực hiện việc này trong giao diện máy tính trường Bảng GIS của ESRI đều có thể thực hiện việc này với trình phân tích cú pháp Python :

PathToContainingFolder =

"\\".join(!FullFilePathWithFileName!.split("\\")[0:-1])

vậy nên

\ Users \ me \ Desktop \ New folder \ file.txt

trở thành

\ Users \ me \ Desktop \ Thư mục mới

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.