Sử dụng mô-đun filepath Twisted của:
from twisted.python.filepath import FilePath
def subdirs(pathObj):
for subpath in pathObj.walk():
if subpath.isdir():
yield subpath
if __name__ == '__main__':
for subdir in subdirs(FilePath(".")):
print "Subdirectory:", subdir
Kể từ khi một số bình luận đã hỏi những ưu điểm của việc sử dụng thư viện Twisted của việc này là, tôi sẽ đi một chút vượt ra ngoài câu hỏi ban đầu ở đây.
Có some improved documentation trong nhánh giải thích những lợi thế của FilePath; bạn có thể muốn đọc điều đó.
Cụ thể hơn trong ví dụ này: không giống như phiên bản thư viện chuẩn, chức năng này có thể được triển khai với không nhập. Hàm "subdirs" là hoàn toàn chung chung, trong đó nó hoạt động trên không có gì ngoài lập luận của nó. Để sao chép và di chuyển tệp bằng thư viện chuẩn, bạn cần phải phụ thuộc vào nội trang "open
", "listdir
", có thể là "isdir
" hoặc "os.walk
" hoặc "shutil.copy
". Có thể "os.path.join
". Không phải đề cập đến thực tế là bạn cần một chuỗi thông qua một đối số để xác định các tập tin thực tế. Chúng ta hãy nhìn vào đầy đủ việc thực hiện mà sẽ sao chép "index.tpl" của mỗi thư mục để "index.html":
def copyTemplates(topdir):
for subdir in subdirs(topdir):
tpl = subdir.child("index.tpl")
if tpl.exists():
tpl.copyTo(subdir.child("index.html"))
Các "subdirs" chức năng trên có thể làm việc trên bất kỳ đối tượng FilePath
-like. Có nghĩa là, trong số những thứ khác, ZipPath
đối tượng. Thật không may ZipPath
là chỉ đọc ngay bây giờ, nhưng nó có thể được mở rộng để hỗ trợ văn bản.
Bạn cũng có thể chuyển đối tượng của riêng mình cho mục đích thử nghiệm. Để kiểm tra các API sử dụng os.path được đề xuất ở đây, bạn phải sử dụng các tên đã nhập và các phụ thuộc ngầm và thường thực hiện phép màu đen để làm cho các thử nghiệm của bạn hoạt động. Với filepath, bạn làm điều gì đó như thế này:
class MyFakePath:
def child(self, name):
"Return an appropriate child object"
def walk(self):
"Return an iterable of MyFakePath objects"
def exists(self):
"Return true or false, as appropriate to the test"
def isdir(self):
"Return true or false, as appropriate to the test"
...
subdirs(MyFakePath(...))
Bạn có thể thấy rằng các câu trả lời được chấp nhận vào câu hỏi SO trước này giải quyết vấn đề: http://stackoverflow.com/questions/120656/directory-listing-in-python –