2012-03-22 40 views
24

Làm cách nào để có được đường dẫn tuyệt đối của tất cả các tệp trong thư mục có thể có nhiều thư mục con trong Python?Nhận đường dẫn tuyệt đối của tất cả các tệp trong thư mục

Tôi biết os.walk() đệ quy cung cấp cho tôi danh sách các thư mục và tệp, nhưng điều đó dường như không giúp tôi có được những gì tôi muốn.

+0

bạn có thể đưa ra một ví dụ về đầu vào và đầu ra mà bạn mong đợi – cwallenpoole

Trả lời

32

os.path.abspath đảm bảo một con đường là tuyệt đối. Sử dụng chức năng helper sau:

import os 

def absoluteFilePaths(directory): 
    for dirpath,_,filenames in os.walk(directory): 
     for f in filenames: 
      yield os.path.abspath(os.path.join(dirpath, f)) 
+0

Tôi nghĩ rằng nó là đẹp hơn để làm abspath chỉ một lần, trên dòng 'os.walk', hơn để làm điều đó N lần bên trong vòng lặp – wim

+0

Đó là công trình, nhưng chỉ bằng" tai nạn ". Đọc hợp đồng 'os.path.join', tôi không thể tìm thấy bất kỳ nơi nào đảm bảo rằng kết quả là tuyệt đối nếu một trong các đối số là, mặc dù đó là một giả định hợp lý. – phihag

+0

Có dấu ngoặc đơn dư thừa ở cuối. Nên có năng suất os.path.abspath (os.path.join (dirpath, f)) – jumbopap

7
import os 

for root, dirs, files in os.walk(os.path.abspath("../path/to/dir/")): 
    for file in files: 
     print os.path.join(root, file) 
+0

Được rồi, tôi hiểu ý của bạn, chỉ là tôi không muốn các tệp, nhưng muốn các thư mục con cụ thể. Tôi đã đăng giải pháp dưới đây. –

3

Bạn có thể sử dụng os.path.abspath() để biến đường dẫn tương đối thành đường dẫn tuyệt đối:

file_paths = [] 

for folder, subs, files in os.walk(rootdir): 
    for filename in files: 
    file_paths.append(os.path.abspath(os.path.join(folder, filename))) 
+1

không tham gia 'cwd' vào' filename', khi bạn muốn tham gia vào 'thư mục'? – wim

+0

Cảm ơn, máy xay sinh tố. Nhưng tôi nghĩ rằng nó phải là .. os.path.abspath (os.path.join (thư mục, tên tập tin)) .. – madCode

+1

Tại sao có, nó có. Cảm ơn, tôi đã sửa nó. – Blender

7

Hãy thử:

import os 

for root, dirs, files in os.walk('.'): 
    for file in files: 
     p=os.path.join(root,file) 
     print p 
     print os.path.abspath(p) 
     print 
+0

Dù sao để làm điều này mà không cần chụp các tập tin ẩn? –

+0

@MarcelMarino 'nếu không phải tệp.startswith ('.')' –

0

Tôi muốn giữ các chi tiết thư mục con và không phải là tập tin và muốn chỉ subdirs với một file xml trong đó. Tôi có thể làm theo cách này:

for rootDirectory, subDirectories, files in os.walk(eventDirectory): 
    for subDirectory in subDirectories: 
    absSubDir = os.path.join(rootDirectory, subDirectory) 
    if len(glob.glob(os.path.join(absSubDir, "*.xml"))) == 1: 
     print "Parsing information in " + absSubDir 
2

Nếu bạn có Python 3.4 hoặc mới hơn, bạn có thể sử dụng pathlib (hoặc một backport của bên thứ ba nếu bạn có một phiên bản Python cũ):

import pathlib 
for filepath in pathlib.Path(directory).glob('**/*'): 
    print(filepath.absolute()) 
Các vấn đề liên quan