Форум сайта python.su
Всем привет! У меня возникла задача, когда в архиве должны также содержаться и пустые каталоги. Как их в архив добавить? Если так делать:
import zipfile
myZip = zipfile.ZipFile (“C:/myArch.zip”, ‘w’, zipfile.ZIP_DEFLATED)
myZip.write (“C:/archFold/newFold/”, “archFold/newFold/”)
myZip.close ()
вылетает ошибка, что write может в архив только файло запихнуть :(
Офлайн
А не проще ли упаковывать в тар, а потом архивировать? Все-таки, для этого он и был создан, чтобы умно сохранять информацию о файлах и каталогах.
Офлайн
если тар использовать, то сразу “w:bz2” и не переживать :), просто хотелось методами зипа все организовать. Так сказать, спортивный интерес.
Офлайн
В таком случае вот вариант:
import zipfile
f = zipfile.ZipFile('archive.zip', ‘w’)
f.writestr('empty/', '')
f.close()
Офлайн
смотреть надо на ZipInfo
Офлайн
ZANо, оно, спасибо :)
В таком случае вот вариант:
import zipfile
f = zipfile.ZipFile('archive.zip', ‘w’)
f.writestr('empty/', '')
f.close()
Офлайн
wellнет, не оно. очень похоже, но не оно. это файл нулевой длины у которого имя заканчивается на /.ZANо, оно, спасибо :)
В таком случае вот вариант:
import zipfile
f = zipfile.ZipFile('archive.zip', ‘w’)
f.writestr('empty/', '')
f.close()
Офлайн
попробуйте (архивация всех файлов папки и разархивация дерева в папку, форматы zip,tar,gz,bz2) :
http://www.ukpyr.narod.ru/files/ul_cmpr.py
меньше всего проблем с кодировкой/путями - с bz2, в gz непонятно с путями в архиве (хотя разархивируется нормально), в zip - с кодировкой
Офлайн
Пример обладает тем же недостатком - не записывает пустые директории (к тому же еще и не рабочий - в нем используется необъявленная функция ‘path_rel’).
Касательно форматов bz2 и gz - они вообще умеют архивировать только одиночный файл, перекладывая проблему объединения группы файлов в один на tar. То бишь, что в формате tar.bz2, что в tar.gz - проблемы путей\кодировок, если и возникнут, то будут идентичными.
Офлайн
path_rel :
def path_rel(target, base=os.curdir, check_presence=False):
‘'’ Return a relative path to the target from either the current dir or an optional base dir,
check_presence=True to check directiries presence ‘'’
if check_presence :
if not os.path.exists(target): raise OSError, ‘Target does not exist: ’ + target
if not os.path.isdir(base): raise OSError, ‘Base is not a directory or does not exist: ’ + base
if os.path.abspath(base) == os.path.abspath(target) : rel_list =
else :
base_list = (os.path.abspath(base)).split(os.sep)
target_list = (os.path.abspath(target)).split(os.sep)
# On the windows platform the target may be on a completely different drive from the base.
if os.name in and base_list <> target_list:
raise OSError, ‘Target is on a different drive to base. Target: ’ + target_list.upper() + ‘, base: ’ + base_list.upper()
# Starting from the filepath root, work out how much of the filepath is shared by base and target.
for i in range(min(len(base_list), len(target_list))) :
if base_list <> target_list: break
else : i += 1 # If we broke out of the loop, i is pointing to the first differing path elements.
rel_list = * (len(base_list)-i) + target_list
return os.path.join(*rel_list)
То бишь, что в формате tar.bz2, что в tar.gzс tar.gz были проблемы в 7zip или total commander
Офлайн