Найти - Пользователи
Полная версия: Модуль zipfile, кодировки и пути
Начало » Python для экспертов » Модуль zipfile, кодировки и пути
1 2 3
well
Всем привет! У меня возникла задача, когда в архиве должны также содержаться и пустые каталоги. Как их в архив добавить? Если так делать:

import zipfile
myZip = zipfile.ZipFile (“C:/myArch.zip”, ‘w’, zipfile.ZIP_DEFLATED)
myZip.write (“C:/archFold/newFold/”, “archFold/newFold/”)
myZip.close ()

вылетает ошибка, что write может в архив только файло запихнуть :(
ZAN
А не проще ли упаковывать в тар, а потом архивировать? Все-таки, для этого он и был создан, чтобы умно сохранять информацию о файлах и каталогах.
well
если тар использовать, то сразу “w:bz2” и не переживать :), просто хотелось методами зипа все организовать. Так сказать, спортивный интерес.
ZAN
В таком случае вот вариант:

import zipfile

f = zipfile.ZipFile('archive.zip', ‘w’)
f.writestr('empty/', '')
f.close()
bialix
смотреть надо на ZipInfo
well
ZAN
В таком случае вот вариант:

import zipfile

f = zipfile.ZipFile('archive.zip', ‘w’)
f.writestr('empty/', '')
f.close()
о, оно, спасибо :)
bialix
well
ZAN
В таком случае вот вариант:

import zipfile

f = zipfile.ZipFile('archive.zip', ‘w’)
f.writestr('empty/', '')
f.close()
о, оно, спасибо :)
нет, не оно. очень похоже, но не оно. это файл нулевой длины у которого имя заканчивается на /.
некоторые архиваторы очень удивляются такому повороту событий.
umup
попробуйте (архивация всех файлов папки и разархивация дерева в папку, форматы zip,tar,gz,bz2) :

http://www.ukpyr.narod.ru/files/ul_cmpr.py

меньше всего проблем с кодировкой/путями - с bz2, в gz непонятно с путями в архиве (хотя разархивируется нормально), в zip - с кодировкой
ZAN
Пример обладает тем же недостатком - не записывает пустые директории (к тому же еще и не рабочий - в нем используется необъявленная функция ‘path_rel’).
Касательно форматов bz2 и gz - они вообще умеют архивировать только одиночный файл, перекладывая проблему объединения группы файлов в один на tar. То бишь, что в формате tar.bz2, что в tar.gz - проблемы путей\кодировок, если и возникнут, то будут идентичными.
umup
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
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