Trích xuất một phần của filepath (một thư mục) trong Python


162

Tôi cần trích xuất tên của thư mục cha của một đường dẫn nhất định. Đây là những gì nó trông giống như:

c:\stuff\directory_i_need\subdir\file

Tôi đang sửa đổi nội dung của "tập tin" bằng một cái gì đó sử dụng directory_i_needtên trong đó (không phải đường dẫn). Tôi đã tạo một hàm sẽ cho tôi một danh sách tất cả các tệp, và sau đó ...

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 thế 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: stackoverflow.com/a/4580931/311220
Acorn

Liên kết trên giúp tôi hiểu cách khắc phục những gì tôi đã làm sai. Cảm ơn bạn.
Thalia

Câu trả lời:


236
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 nếu cần ...

Chỉnh sửa: từ os.path , bạn có thể sử dụng 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.

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

42

Trong Python 3.4, bạn có thể sử dụng mô đun pathlib :

>>> 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

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

Điều này cũng đã được đưa vào các phiên bản cũ hơn của Python: pathlib2
phoenix

11

Tất cả bạn cần là parentmột phần nếu bạn sử dụng pathlib.

from pathlib import Path
p = Path(r'C:\Program Files\Internet Explorer\iexplore.exe')
print(p.parent) 

Sẽ xuất:

C:\Program Files\Internet Explorer    

Trường hợp bạn cần tất cả các phần (đã được nêu trong các câu trả lời khác) sử dụng parts:

p = Path(r'C:\Program Files\Internet Explorer\iexplore.exe')
print(p.parts) 

Sau đó, bạn sẽ nhận được một danh sách:

('C:\\', 'Program Files', 'Internet Explorer', 'iexplore.exe')

Tiết kiệm thời gian.


5

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

Mặt khác, một cách bán xấu để hoàn thành công việc 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'

trong đó hiển thị lấy thư mục ngay phía trên tệp và thư mục ngay phía trên đó.


Tôi đã chỉnh sửa mục nhập của mình để hiển thị việc sử dụng rsplit, thứ thực hiện 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õ những gì bạn đang hỏi. Tại sao bạn không tước mọi thứ sang trái của phiên bản cao hơn tiếp theo của \\? Giả vờ như bạn muốn đường dẫn, sau đó chỉ giữ lại mục cuối cùng của nó khi bạn tách nó trên \. Điều này có nên làm việc không?
ely

Cuối cùng tôi đã tách con đường và lấy đoạn 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 mình đã làm gì sai.
Thalia

Nếu đọc câu trả lời đã giúp bạn, hãy xem xét ít nhất là bỏ phiếu cho họ và có thể chấp nhận một trong số họ. Tôi rất vui vì bạn đã phát hiện ra lỗi.
ely

Tôi thích cách làm việc nửa xấu xí này. Tôi thay đổi "\\" bằng một os.sep đơn giản và nó hoạt động hoàn hảo để lấy chỉ một phần của đường dẫn.
TazgerO

1

Đây là những gì tôi đã làm để trích xuất phần 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.


0
import os

directory = os.path.abspath('\\') # root directory
print(directory) # e.g. 'C:\'

directory = os.path.abspath('.') # current directory
print(directory) # e.g. 'C:\Users\User\Desktop'

parent_directory, directory_name = os.path.split(directory)
print(directory_name) # e.g. 'Desktop'
parent_parent_directory, parent_directory_name = os.path.split(parent_directory)
print(parent_directory_name) # e.g. 'User'

Điều này cũng nên làm các mẹo.


-1

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


Đ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, vì các tài liệu Python cho trạng thái công cụ os.path.
ely
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.