2016-12-09 5 views
1

Учитывая каталог на пути a:\\b\\c\\d\\e, я хочу, чтобы создать ZipFile в Python 3.5 и более поздней, который выглядит следующим образом:Включить структуру каталогов в виде архива на основе фиксированного относительного пути

file.zip # want this 
+d 
    +-...files from d\ 
    +-e 
    +-...files from e\ 

Я попытался это пешком целевой путь, используя os и zipfile:

start_path = "a:\\b\\c\\d" 

for root, dirs, files in os.walk(start_path): 
    for file in files: 
     ziph.write(os.path.relpath(os.path.join(root, file))) 

в связи с relpath и работать реж быть в b, код будет создать почтовый файл следующим образом:

file.zip # do not want this 
+c 
    +-...files from c\ 
    +-d 
    +-...files from d\ 
    +-e 
     +-...files from e\ 

Мой вопрос: Как я могу заставить zipwriter создать структуру каталогов, как показано в начале, начиная с режем d в то время как я знаю, что полный путь только во время выполнения.

ответ

1

ZipFile.write принимает second parameter, который является каталогом, в котором вы хотите, чтобы он находился внутри zip. Таким образом, вы можете иметь что-то вроде:

start_path = "a:\\b\\c\\d" 
import os 
zip_start_path = start_path.split(os.sep)[-1] 
+0

Спасибо! Кажется, я упустил этот параметр 'arcname'. Могу ли я сделать раздельный разделитель пути независимым? –

+0

Да, вы получаете разделитель с 'os.sep' (https://docs.python.org/3/library/os.html#os.sep) – lucasnadalutti

+0

Спасибо, это помогает мне! –