2012-01-30 32 views
9

Khi tôi chạy os.walk(), tôi nhận được kết quả theo thứ tự chữ và số; bắt đầu từ 0, kết thúc tại z. Có thể đảo ngược điều này không?os.walk() ngược lại?

Vì vậy, nếu tôi có 3 thư mục; apple/, bananas/, pears/, tôi muốn pears/, bananas/apples/ trả lại.

Rõ ràng là tôi có thể lưu trữ tất cả các thư mục dưới dạng danh sách và sau đó .reverse() nhưng sẽ mất nhiều thời gian.

+2

tại sao bạn cần thực hiện việc này? –

+0

vì tôi đang làm việc trên một tập hợp các thư mục rất lớn theo thứ tự số và tôi muốn xem các con số cao nhất trước tiên. – jdborg

Trả lời

15

Trước hết, os.walk() không chỉ định thứ tự các thư mục được trả về, vì vậy nếu tôi là bạn, tôi sẽ không dựa vào thứ tự chữ cái.

Có nói rằng, bạn có thể chọn thứ tự các thư mục con nằm ngang bằng cách để lại topdown thiết lập để giá trị mặc định của nó (True), và sau đó sắp xếp dirs tại chỗ:

import os 
top='/home/aix' 
for root, dirs, files in os.walk(top, topdown=True): 
    print root 
    dirs.sort(reverse=True) 

Điều đó sẽ làm cho os.walk() duyệt qua các thư mục con theo thứ tự từ điển đảo ngược của tên của chúng.

Các documentation giải thích cách làm việc này:

Khi topdownTrue, người gọi có thể sửa đổi danh sách dirnames tại chỗ (có lẽ sử dụng del hoặc chuyển nhượng lát), và walk() sẽ chỉ recurse vào thư mục con mà tên vẫn còn trong dirnames; điều này có thể được sử dụng để cắt giảm tìm kiếm, áp đặt một thứ tự cụ thể truy cập hoặc thậm chí thông báo cho walk() về các thư mục người gọi tạo hoặc đổi tên trước khi nó tiếp tục lại walk().

+0

Cảm ơn. Đọc tài liệu trước khi bàn tay, nhưng không nhận ra rằng có nghĩa là bạn có thể sắp xếp lại một cách nhanh chóng. – jdborg

1

Bạn không thể đảo ngược trình tạo theo bất kỳ cách thức chung nào. Giải pháp duy nhất là đưa nó vào một chuỗi và lặp lại chuỗi đó theo thứ tự đảo ngược. Các điều khoản sau của máy phát không nhất thiết phải được biết đến cho đến khi các máy trước đó được tính toán.

Giải pháp dưới đây sử dụng được đảo ngược. Hiệu suất sẽ ổn nếu cấu trúc thư mục không sâu.

import os 

directory = '/your/dir/' 
for root, dirs, files in reversed(list(os.walk(directory))): 
    print root, dirs, files 
1

Bạn cần phải hiểu rằng bạn thực sự có thể thay đổi dirs sử dụng bởi os.walk. (Ít nhất trừ khi bạn đặt topdown=False một cách rõ ràng).

Cụ thể, bạn có thể lấy ví dụ, xóa danh bạ hoặc sử dụng danh sách.

import os 
for root, dirs, files in os.walk(startdir): 
    dirs.sort(reverse=True) 
    # Also remove dirs you do not need! 

Thực sự nên thực hiện thủ thuật mà không mất thêm chi phí đáng kể nào.

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