создать zip-файл полного каталога с помощью модуля zipfile python - PullRequest
1 голос
/ 26 декабря 2010
zip = zipfile.ZipFile(destination+ff_name,"w")
            zip.write(source)
            zip.close()

Выше приведен код, который я использую, а здесь «источник» - путь к каталогу.Но когда я запускаю этот код, он просто архивирует исходную папку, а не файлы и папки, содержащиеся в ней.Я хочу, чтобы он сжимал исходную папку рекурсивно.Используя модуль tarfile, я могу сделать это, не передавая никакой дополнительной информации.Пожалуйста помоги.Спасибо

Ответы [ 3 ]

2 голосов
/ 26 декабря 2010

Я не проверял это точно, но это похоже на то, что я использую.

zip = zipfile.ZipFile(destination+ff_name, 'w', zipfile.ZIP_DEFLATED)
rootlen = len(source) + 1
for base, dirs, files in os.walk(source):
    for file in files:
        fn = os.path.join(base, file)
        zip.write(fn, fn[rootlen:])

Этот пример отсюда:

http://bitbucket.org/jgrigonis/mathfacts/src/ff57afdf07a1/setupmac.py

2 голосов
/ 26 декабря 2010

Стандартная функция os.path.walk () , вероятно, будет очень полезна для этого.

Кроме того, чтение модуля tarfile, чтобы увидеть, как оно работаетбезусловно, принесет пользу.Действительно, рассмотрение того, как были написаны части стандартной библиотеки, было неоценимой частью моего изучения Python.

1 голос
/ 20 октября 2013

Я бы хотел добавить «новую» функцию Python 2.7 в эту тему: ZipFile можно использовать как менеджер контекста, и поэтому вы можете делать такие вещи:

        with zipfile.ZipFile(my_file, 'w') as myzip:
            rootlen = len(xxx) #use the sub-part of path which you want to keep in your zip file 
            for base, dirs, files in os.walk(pfad):
                for ifile in files:
                    fn = os.path.join(base, ifile)
                    myzip.write(fn, fn[rootlen:])
...