Лучший способ пройтись по дереву каталогов - это os.walk - выполняет разделение файлов и каталогов, а также рекурсию до подкаталогов.
Итак:
def zipws(path, zip, filename='Data.gdb'):
for root, dirs, files in os.walk(path):
if filename in files:
zip.write(os.path.join(root, filename),
os.path.join(os.path.basename(root), filename))
return
Я не уверен, что захватил всю логику, с которой вы хотите определить два аргумента, до zip.write
(для меня это не очевидно из вашего кода), но если нет, то это должно быть легко настроить .
Кроме того, я не уверен, хотите ли вы, чтобы return
в конце: эффект архивирует только один файл с таким именем, в отличие от архивирования всех файлов. назван так, что может встречаться в дереве (в соответствующих подкаталогах). Если вы знаете, что есть только один такой файл, то можете также оставить return
(это только немного ускорит процесс). Если вы хотите, чтобы все такие файлы были более одного, удалите return
.
Редактировать : получается, что «одна вещь», которую хочет ОП - это каталог , а не файл. В этом случае я бы предложил в качестве самого простого решения:
def zipws(path, zip, dirname='Data.gdb'):
for root, dirs, files in os.walk(path):
if os.path.basename(root) != dirname: continue
for filename in files:
zip.write(os.path.join(root, filename),
os.path.join(dirname, filename))
return
снова с похожим предположением относительно полной тайны, что именно это является , которое вы хотите использовать для своего имени архива.