2017-01-03 2 views
2

Я пытаюсь сжать все файлы в папке (папка не имеет каких-либо поддиретов) с использованием модуля zipfile python, но, похоже, не может получить желаемый результат.Python - Сжать все файлы в каталоге с помощью zipfile-модуля

У меня есть folderA, сидящий под F:\Projects\ProjectA\Folders\folderA and my script under F:\Projects\ProjectA\CodeA\zipcode.py. Я хочу сжать все файлы в папке A, чтобы полученный zip-файл был назван как folderA.zip под F:\Projects\ProjectA\Folders и с оригинальными именами файлов.

Единственная проблема заключается в том, что при распаковке результата получается папка \ folderA, а не только folderA. Он имеет отношение к относительному пути к папке для сценария, но я не могу получить желаемый результат.

#zipcode.py 
import os 
import zipfile 

filepath = "F:/Projects/ProjectA/Folders/folderA" 

archive = zipfile.ZipFile(os.path.abspath(filepath) + '.zip', 'w') 

for root, dirs, files in os.walk(filepath): 
     for afile in files: 
      archive.write(os.path.relpath(os.path.join(root, afile))) 
     archive.close() 

ответ

0

в цикле, изменить имя архива члена с помощью arcname параметра:

archive.write(os.path.join(root, afile),arcname=name_in_archive) 

Где

name_in_archive = os.path.join(os.path.basename(filepath),afile) 

сохранить folderA путь.

Одна вещь, которую я не уверен (в зависимости от версий python), заключается в том, что вам, возможно, придется заменить обратную косую черту косой чертой, чтобы файл ZIP был переносимым. Не больно:

archive.write(os.path.join(root, afile),arcname=name_in_archive.replace(os.sep,"/")) 

Обратите внимание, что я сбросивший os.path.relpath вызов, не требуется сейчас, так как мы имеем полный контроль над именем файла в архиве.

Также обратите внимание, что преобразование в абсолютный путь при открытии архива не требуется. open находит файл, если это родственник, а также, если это является абсолютным:

archive = zipfile.ZipFile(os.path.abspath(filepath) + '.zip', 'w') 

может быть просто написано

archive = zipfile.ZipFile(filepath + '.zip', 'w') 
+0

Я на самом деле хочу, чтобы выходной файл зип содержать папку с именем folderA со всеми файлами, проживающих в этом. Вышеуказанное будет записывать файлы непосредственно в zip-файл. –

+0

@Riz_K: true для моего первого ответа, но мое редактирование добавлено 'name_in_archive = os.path.join (os.path.basename (filepath), afile)'. Это добавляет префикс 'folderA' ко всем вашим файлам. Важно то, что вы знаете, как управлять именами файлов в вашем архиве. –

+0

Awesome ... спасибо за подробности! –

Смежные вопросы