2010-10-06 2 views
3

Я создаю программное обеспечение Python, которое сжимает файлы/папки ... Как создать раздел кода, который запрашивает пользовательский ввод местоположения папки, а затем сжимает его. В настоящее время у меня есть код для одного файла, но не папка с файлами. Пожалуйста, подробно объясните, как это сделать.Как сжать папку с помощью модуля Python GZip?

+0

Разве gzip не должен делать только сжатие, а не архивирование? Разве вы не должны, возможно, смотреть на смолу? –

ответ

6

GZip не выполняет сжатие папок/каталогов, только отдельные файлы. Вместо этого используйте модуль zipfile.

0

Как говорит larsmans, сжатие gzip не используется для каталогов, а только для одиночных файлов. Обычный способ делать вещи с помощью linux - сначала поставить каталог в tarball, а затем сжать его.

+1

Стоит упомянуть, что вы можете улучшить сжатие, когда вы tar и затем сжимаете, чем если бы вы сжимали каждый файл по отдельности. – synthesizerpatel

5

Я не использую пользовательский интерфейс, поэтому вы сами можете получить имя папки от пользователя. Вот один из способов создания gz-сжатого tarfile. Это не рекурсия по подпапкам, вам понадобится что-то вроде os.walk().

# assume the path to the folder to compress is in 'folder_path' 

import tarfile 
import os 

with tarfile.open(folder_path + ".tgz", "w:gz") as tar: 
    for name in os.listdir(folder_path): 
     tar.add(name) 
+0

На самом деле вы можете просто написать «tar.add (folder_path)», и он будет добавлен рекурсивно. (Конечно, это может быть новая функция, добавленная за пять лет с момента публикации этого ответа!) Кроме того, цикл for не следует отступать здесь, если вы не измените «tar = tarfile.open (...)» на 'с tarfile.open (...) как tar:' (это хорошая идея, а затем вы можете избавиться от строки 'tar.close()'). –

+0

Спасибо, не знаю, как эта ошибка отступа сохранилась в течение 5 лет. –

10

код сжать папку для гудрона файла:

import tarfile 

tar = tarfile.open("TarName.tar.gz", "w:gz") 
tar.add("folder/location", arcname="TarName") 
tar.close() 

Это работает для меня. Надеюсь, это сработает и для вас.