Shutil make_archive приводит к вложенным файлам .zip

Я пытался использовать make_archive из библиотеки shutil.

Вот код (с подробными комментариями):

from shutil import make_archive
make_archive(
  'zipfile_name', 
  'zip',           # archive format
  root_dir=None,   # current working dir if None
  base_dir=None)   # cwd if None 

Вот пример дерева каталогов:

folder
│   script.py
└───subfolder1
│   │   file011.txt
│   │   file012.txt
│   │
└───subfolder2
│   │   file011.txt
│   │   file012.txt
│   │
...

Если я запускаю свой скрипт (с кодом выше), результат будет таким:

folder
│   script.py
└───subfolder1
│   │   file011.txt
│   │   file012.txt
│   │
└───subfolder2
│   │   file011.txt
│   │   file012.txt
│   │
└───zipfile_name.zip
│   │   same content as above (like expected)
│   │   zipfile_name.zip

...

Почему создается дополнительный zipfile_name.zip? Также обратите внимание, что второй архив не может быть открыт, так как он недействителен. Я понимаю, если раньше никто не сталкивался с этой проблемой, но, возможно, у меня неправильные параметры, и поэтому я спрашиваю.


person scharette    schedule 25.10.2017    source источник
comment
@ekhumoro Разве связанный дубликат не новее моего вопроса? Почему эту тему закрыли, а другую нет?   -  person scharette    schedule 01.10.2019
comment
На ваш вопрос не было ответов, когда был задан другой, поэтому ни один из них не мог быть помечен как дубликат в то время. Сейчас не так много вариантов выбора между двумя вопросами, за исключением того, что у другого было немного больше активности (то есть комментарии). Оба вопроса по-прежнему имеют значение, поэтому важно было связать их вместе, чтобы другим было легче их найти.   -  person ekhumoro    schedule 01.10.2019


Ответы (1)


Я также столкнулся с этой проблемой. Вот простой трюк для решения проблемы: используйте относительный путь как base_name:

from shutil import make_archive
make_archive(
  '../zipfile_name', 
  'zip',           # archive format
  root_dir=None,   # current working dir if None
  base_dir=None)   # cwd if None 

Архив будет создан в родительском каталоге, не пересекаясь с архивируемым каталогом.

person Community    schedule 12.09.2018