Найти - Пользователи
Полная версия: Python и архивация каталога со всем содержимым
Начало » Python для новичков » Python и архивация каталога со всем содержимым
1 2
vladimirse
Доброго времени суток, уважаемые!
На днях начал изучать python. Возник вопрос, как сделать архив каталога сов сем содержимым?
Делаю так:
#!/usr/bin/python
#coding=utf8
import datetime
import zipfile
import os
now_date=datetime.date.today()
src="/var/www"
dst="backup-"+str(now_date)+".zip"
zip=zipfile.ZipFile(dst, 'w')
zip.write(src, os.path.basename(src), zipfile.ZIP_DEFLATED)
zip.close()

В получившемся zip-архиве находится только пустой каталог www.
Saturn
Так должно работать
with ZipFile('test.zip', 'w') as zip:
    path = 'path\to\folder'
    files = os.listdir(path)
  
    for i in files:
        file = os.path.join(path, i)
        zip.write(file)
vladimirse
Выдает:
 File "./new.py", line 6, in <module>
    with zipfile.ZipFile('new.zip', 'w') as zip:
AttributeError: ZipFile instance has no attribute '__exit__'

vladimirse
Я понимаю, что вопрос возможно весьма низкого уровня, но не могли бы вы пояснить чайнику как его решить?
sanodin
Попробуй просто без “with as”
import zipfile
import os
zipfd = zipfile.ZipFile('test.zip','w', zipfile.ZIP_DEFLATED)
path = '1'
files = os.listdir(path)
for i in files:
    file = os.path.join(path, i)
    zipfd.write(file)
zipfd.close()
vladimirse
sanodin
Попробуй просто без “with as”
import zipfile
import os
zipfd = zipfile.ZipFile(open('test.zip','w'),'w', zipfile.ZIP_DEFLATED)
path = ‘1’
files = os.listdir(path)
for i in files:
file = os.path.join(path, i)
zipfd.write(file)
zipfd.close()

Работает, но только в том случае, если каталог содержит файлы. Если в нем есть подкаталоги создается битый архив.
Не могли бы вы пояснить конструкции:
zipfile.ZipFile(open('test.zip','w'),'w', zipfile.ZIP_DEFLATED)
и
os.path.join(path, i)
sanodin
import os, zipfile
#from os.path import join, getsize
yourfolder = 'Ваша папка'
arch = zipfile.ZipFile('Название вашего архива.zip', 'w', zipfile.ZIP_DEFLATED)
for root, dirs, files in os.walk(yourfolder):
    print root+'\\'+str(files)
    for tarfile in files:
        if tarfile != '':
            arch.write(root+'\\'+tarfile)
arch.close()
doza_and
А вам не кажется что для стандартных задачек лучше использовать стандартный подход:
import subprocess as sp
sp.check_call("7z a -tzip arhname dirname")
Меньше писанины, выше быстродействие, больше степень сжатия, намного меньше вероятность возникновения ошибок. Необходимость ручной сборки архива требует специального обоснования.
vladimirse
sanodin
import os, zipfile
#from os.path import join, getsize
yourfolder = 'Ваша папка'
arch = zipfile.ZipFile('Название вашего архива.zip', 'w', zipfile.ZIP_DEFLATED)
for root, dirs, files in os.walk(yourfolder):
    print root+'\\'+str(files)
    for tarfile in files:
        if tarfile != '':
            arch.write(root+'\\'+tarfile)
arch.close()

Работает! НО, если папка пустая и/или содержит пустые подкаталоги, то эта папка не попадает в архив.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB