Tôi đang cố gắng viết một hàm Python sẽ đệ quy xóa tất cả các thư mục trống. Điều này có nghĩa là nếu thư mục "a" chỉ chứa "b", "b" nên bị xóa, thì "a" sẽ bị xóa (vì nó không chứa gì cả). Nếu một thư mục chứa bất cứ thứ gì, nó sẽ bị bỏ qua. Minh họa:Tại sao os.walk của python() không phản ánh việc xóa thư mục?
top/a/b/
top/c/d.txt
top/c/foo/
Vì điều này, ba thư mục "b", "a", và "foo" nên bị xóa, như "foo" và "b" là trống bây giờ, và "a" sẽ trở nên trống rỗng sau khi xóa "b".
Tôi đang cố thực hiện điều này qua os.walk
và shutil.rmtree
. Thật không may, mã của tôi chỉ xóa cấp thư mục đầu tiên, nhưng không chỉ xóa các thư mục mới trong quá trình này.
Tôi đang sử dụng thông số topdown=false
của os.walk
. documentation cho os.walk
nói rằng "Nếu topdown là Sai, ba cho thư mục được tạo sau khi ba cho tất cả các thư mục con của nó (thư mục được tạo từ dưới lên)." Đó không phải là những gì tôi thấy.
Dưới đây là mã của tôi:
for root, dirs, files in os.walk(".", topdown=False):
contents = dirs+files
print root,"contains:",contents
if len(contents) == 0:
print 'Removing "%s"'%root
shutil.rmtree(root)
else:
print 'Not removing "%s". It has:'%root,contents
Nếu tôi đã cấu trúc thư mục được mô tả ở trên, đây là những gì tôi nhận được:
./c/foo contains: []
Removing "./c/foo"
./c contains: ['foo', 'd.txt']
Not removing "./c". It has: ['foo', 'd.txt']
./a/b contains: []
Removing "./a/b"
./a contains: ['b']
Not removing "./a". It has: ['b']
. contains: ['c', 'a']
Not removing ".". It has: ['c', 'a']
Lưu ý rằng, mặc dù tôi đã gỡ bỏ "b", " một "không được loại bỏ, nghĩ rằng nó vẫn còn chứa" b ". Những gì tôi đang bối rối về là tài liệu cho os.walk
nói rằng nó tạo ra ba cho "./a" sau khi tạo ra ba cho "b". Đầu ra của tôi cho thấy nếu không. Câu chuyện tương tự cho "./c". Nó cho thấy rằng nó vẫn còn "foo", mặc dù tôi đã xóa nó ngay ra khỏi cổng.
Tôi đang làm gì sai? (Tôi đang sử dụng Python 2.6.6.)
Tôi không mong đợi os.đi bộ để được cập nhật trên mỗi lần lặp của vòng lặp 'for' – jcfollower
Tôi đoán đó là chìa khóa. "Trước" và "sau" trong tài liệu tham chiếu đến thứ tự trong kết quả mảng kết quả bằng 'os.walk()', không phải là một thứ tự thời gian của các lần lặp liên tiếp thông qua vòng lặp 'for'. Thực tế là người gọi, trong chế độ 'topdown = True', có thể sửa đổi đối số' dirnames' khiến tôi nghĩ rằng việc lặp lại có thể bị ảnh hưởng. – seanahern