2013-03-04 34 views
6

Tôi đang cố gắng viết trình xử lý tác vụ lên các tệp trong nhiều thư mục con khác nhau, nhưng trong khi tập lệnh của tôi có thể xem các tệp này, nó không thể làm bất kỳ điều gì với chúng lắp ráp đường đi của họ.Sử dụng đúng cách os.path và os.join

Phần vấn đề xuất phát từ vòng này:

for (path, dirs, files) in os.walk("data/"): 
    for image in files: 
     #do something to the image 

Bây giờ, kịch bản hoạt động ở cấp độ đầu tiên của thư mục data, nhưng không làm việc trên các thư mục con data 's.

tôi đã cố gắng sử dụng os.path.join():

for (path, dirs, files) in os.walk("data/"): 
    print os.path.join(path, dirs) 

Nhưng đó ném như sau:

Traceback (most recent call last): 
    File "bench.py", line 26, in <module> 
    print os.path.join(path, dirs) 
    File "/usr/lib/python2.7/posixpath.py", line 75, in join 
    if b.startswith('/'): 
AttributeError: 'list' object has no attribute 'startswith' 

Nói tóm lại, những gì tôi muốn làm là lắp ráp một con đường từ data đến hình ảnh trong đó bao gồm data 's thư mục con. Thực hành tốt nhất để làm điều này là gì?

+2

Khi bạn nhận được một ngoại lệ như thế này, thường là do bạn đang cố gắng thực hiện điều gì đó với danh sách các giá trị như 'dirs' thay vì mỗi giá trị. (Nếu bạn đã không nhận ra 'dirs' là một danh sách, ngoại trừ nên nâng khả năng đó là một lá cờ đỏ, và bạn có thể thử' dirs' in hoặc 'kiểu in (dirs)' để tìm hiểu.) Bạn có thể giải quyết việc này bằng cách sử dụng một vòng lặp 'for', một danh sách hiểu,' bản đồ', vv, như là câu trả lời của mgilson cho thấy, một khi bạn nhận ra đó là những gì bạn đang cố gắng làm. – abarnert

Trả lời

7

Tôi nghĩ rằng bạn muốn tham gia path với file cho mỗi file trong files

for path,dirs,files in os.walk('data/'): 
    for f in files: 
     fname = os.path.join(path,f) 
     assert(os.path.exists(fname)) 

dirs là một list của thư mục đó nằm trong thư mục path. Bạn thực sự có thể thay đổi dirs tại chỗ để ngăn chặn os.walk từ bước vào vào thư mục nào đó (gọn gàng!).

+0

@StevenRumbalski - Có. Đúng rồi. Cảm ơn bạn đã làm rõ. (Tôi đã chỉnh sửa - Hy vọng tránh nhầm lẫn) – mgilson

+0

+1. Và tất nhiên bạn cũng có thể '' join' path' với nhau 'dir' trong 'dirs', nếu bạn cần phải làm điều gì đó với các thư mục con (ngoài chỉ thấy tên của họ hoặc prune danh sách). – abarnert

1

Hãy thử:

for (path, dirs, files) in os.walk("data/"): 
    for image in files: 
    fname = os.path.join(path, image) 
    file = open(fname, 'rb') 

Hai ví dụ tại os.walk documentation cả làm chỉ điều này.

0
for (path, dirs, files) in os.walk("data/"): 
    for image in files: 
    file_path = os.path.join(path, image) 
    # do your stuff 
Các vấn đề liên quan