Использование модуля FilePath в Twisted:
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
Поскольку некоторые комментаторы спрашивают, в чем преимущества использования библиотек Twisted для этого, я немного перейду к исходному вопросу.
В ветке улучшена документация , объясняющая преимущества FilePath; Вы можете прочитать это.
Более конкретно в этом примере: в отличие от стандартной версии библиотеки, эта функция может быть реализована с без импорта . Функция "subdirs" является полностью родовой в том смысле, что она работает только с аргументом. Чтобы копировать и перемещать файлы с использованием стандартной библиотеки, вам необходимо зависеть от встроенных «open
», «listdir
», возможно, «isdir
» или «os.walk
» или «shutil.copy
» , Может быть "os.path.join
" тоже. Не говоря уже о том, что вам нужно, чтобы строка передавала аргумент для идентификации фактического файла. Давайте посмотрим на полную реализацию, которая будет копировать "index.tpl" каждого каталога в "index.html":
def copyTemplates(topdir):
for subdir in subdirs(topdir):
tpl = subdir.child("index.tpl")
if tpl.exists():
tpl.copyTo(subdir.child("index.html"))
Вышеуказанная функция "subdirs" может работать с любым FilePath
-подобным объектом. Что означает, помимо прочего, ZipPath
объекты. К сожалению, ZipPath
сейчас доступен только для чтения, но его можно расширить для поддержки записи.
Вы также можете передавать свои собственные объекты для тестирования. Чтобы протестировать предлагаемые здесь API-интерфейсы с использованием os.path, вы должны использовать импортированные имена и неявные зависимости и, как правило, выполнять черную магию, чтобы ваши тесты работали. С FilePath вы делаете что-то вроде этого:
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(...))