2012-04-13 28 views
72

Tôi cần trích xuất tên của thư mục mẹ của một đường dẫn nhất định. Đây là hình thức của nó: c:\ stuff \ directory_i_need \ subdir \ file. Tôi đang sửa đổi nội dung của "tệp" với nội dung nào đó sử dụng tên directory_i_need trong đó (không phải đường dẫn). Tôi đã tạo một hàm sẽ cung cấp cho tôi danh sách tất cả các tệp, và sau đó ...Trích xuất một phần của filepath (một thư mục) trong Python

for path in file_list: 
    #directory_name = os.path.dirname(path) # this is not what I need, that's why it is commented 
    directories, files = path.split('\\') 

    line_replace_add_directory = line_replace + directories 
    # this is what I want to add in the text, with the directory name at the end 
    # of the line. 

Làm cách nào tôi có thể làm điều đó?

+1

Bạn có thể muốn kiểm tra câu trả lời này ra: http://stackoverflow.com/a/4580931/311220 – Acorn

+0

Liên kết ở trên đã giúp tôi hiểu làm thế nào để sửa chữa những gì tôi đã làm sai. Cảm ơn bạn. – Thalia

Trả lời

103
import os 
## first file in current dir (with full path) 
file = os.path.join(os.getcwd(), os.listdir(os.getcwd())[0]) 
file 
os.path.dirname(file) ## directory of file 
os.path.dirname(os.path.dirname(file)) ## directory of directory of file 
... 

Và bạn có thể tiếp tục làm điều này nhiều lần khi cần thiết ...

Edit: từ os.path, bạn có thể sử dụng một trong hai os.path.split hoặc os.path.basename:

dir = os.path.dirname(os.path.dirname(file)) ## dir of dir of file 
## once you're at the directory level you want, with the desired directory as the final path node: 
dirname1 = os.path.basename(dir) 
dirname2 = os.path.split(dir)[1] ## if you look at the documentation, this is exactly what os.path.basename does. 
+0

Nó trích xuất các phần của đường dẫn - nhưng tôi không biết cách trích xuất tên thư mục thực tế từ đường dẫn. – Thalia

+1

Tôi đã chỉnh sửa bài đăng để bao gồm trích xuất tên thư mục. –

-1

Bạn phải đặt toàn bộ đường dẫn làm tham số cho os.path.split. Xem The docs. Nó không hoạt động như tách chuỗi.

+0

Điều này sẽ không hoạt động trên các tên đường dẫn loại UNC trên Windows, như tài liệu Python cho trạng thái công cụ os.path. – ely

4

Trước tiên, xem bạn có splitunc() làm chức năng có sẵn trong phạm vi os.path hay không. Mục đầu tiên trả về phải là thứ bạn muốn ... nhưng tôi đang dùng Linux và tôi không có chức năng này khi nhập os và cố gắng sử dụng nó.

Nếu không, một cách semi-xấu xí mà được công việc làm là sử dụng:

>>> pathname = "\\C:\\mystuff\\project\\file.py" 
>>> pathname 
'\\C:\\mystuff\\project\\file.py' 
>>> print pathname 
\C:\mystuff\project\file.py 
>>> "\\".join(pathname.split('\\')[:-2]) 
'\\C:\\mystuff' 
>>> "\\".join(pathname.split('\\')[:-1]) 
'\\C:\\mystuff\\project' 

đó cho thấy lấy thư mục ngay trên tập tin và thư mục ngay trên đó.

+0

Tôi đã chỉnh sửa mục nhập của mình để hiển thị việc sử dụng rsplit làm những gì bạn đề xuất - nhưng vẫn cung cấp cho tôi đường dẫn không chỉ tên thư mục. – Thalia

+1

Tôi vẫn chưa rõ bạn đang hỏi gì. Tại sao bạn không vứt tất cả mọi thứ sang trái của phiên bản cao hơn tiếp theo của \\ sau đó? Giả vờ như bạn muốn con đường, sau đó chỉ cần giữ cho mục nhập cuối cùng của điều đó khi bạn chia nó trên \\. Điều này sẽ làm việc, không? – ely

+0

Tôi đã kết thúc chia tách con đường và lấy mảnh tôi muốn, nó không hoạt động trước nhưng sau khi đọc tất cả những câu trả lời này, tôi phát hiện ra những gì tôi đã làm sai. – Thalia

1

Đây là những gì tôi đã làm để trích xuất các mảnh của thư mục:

for path in file_list: 
    directories = path.rsplit('\\') 
    directories.reverse() 
    line_replace_add_directory = line_replace+directories[2] 

Cảm ơn sự giúp đỡ của bạn.

12

Trong Python 3.4 bạn có thể sử dụng pathlib module:

>>> from pathlib import Path 
>>> p = Path('C:\Program Files\Internet Explorer\iexplore.exe') 
>>> p.name 
'iexplore.exe' 
>>> p.suffix 
'.exe' 
>>> p.root 
'\\' 
>>> p.parts 
('C:\\', 'Program Files', 'Internet Explorer', 'iexplore.exe') 
>>> p.relative_to('C:\Program Files') 
WindowsPath('Internet Explorer/iexplore.exe') 
>>> p.exists() 
True 
+0

trình diễn tuyệt vời về API –

+0

Điều này cũng đã được trả lại cho các phiên bản cũ hơn của Python: [pathlib2] (https://pypi.python.org/pypi/pathlib2/) – phoenix

Các vấn đề liên quan