Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 23, 2008 11:20:24

well
От:
Зарегистрирован: 2006-11-20
Сообщения: 163
Репутация: +  0  -
Профиль   Отправить e-mail  

Модуль zipfile, кодировки и пути

Всем привет! У меня возникла задача, когда в архиве должны также содержаться и пустые каталоги. Как их в архив добавить? Если так делать:

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

вылетает ошибка, что write может в архив только файло запихнуть :(



Офлайн

#2 Апрель 23, 2008 13:24:49

ZAN
От:
Зарегистрирован: 2007-06-10
Сообщения: 403
Репутация: +  10  -
Профиль   Отправить e-mail  

Модуль zipfile, кодировки и пути

А не проще ли упаковывать в тар, а потом архивировать? Все-таки, для этого он и был создан, чтобы умно сохранять информацию о файлах и каталогах.



Офлайн

#3 Апрель 23, 2008 17:44:42

well
От:
Зарегистрирован: 2006-11-20
Сообщения: 163
Репутация: +  0  -
Профиль   Отправить e-mail  

Модуль zipfile, кодировки и пути

если тар использовать, то сразу “w:bz2” и не переживать :), просто хотелось методами зипа все организовать. Так сказать, спортивный интерес.



Офлайн

#4 Апрель 23, 2008 19:01:16

ZAN
От:
Зарегистрирован: 2007-06-10
Сообщения: 403
Репутация: +  10  -
Профиль   Отправить e-mail  

Модуль zipfile, кодировки и пути

В таком случае вот вариант:

import zipfile

f = zipfile.ZipFile('archive.zip', ‘w’)
f.writestr('empty/', '')
f.close()



Офлайн

#5 Апрель 24, 2008 12:09:10

bialix
От:
Зарегистрирован: 2006-07-13
Сообщения: 774
Репутация: +  1  -
Профиль   Отправить e-mail  

Модуль zipfile, кодировки и пути

смотреть надо на ZipInfo



Офлайн

#6 Апрель 24, 2008 13:14:23

well
От:
Зарегистрирован: 2006-11-20
Сообщения: 163
Репутация: +  0  -
Профиль   Отправить e-mail  

Модуль zipfile, кодировки и пути

ZAN
В таком случае вот вариант:

import zipfile

f = zipfile.ZipFile('archive.zip', ‘w’)
f.writestr('empty/', '')
f.close()
о, оно, спасибо :)



Офлайн

#7 Апрель 24, 2008 15:12:07

bialix
От:
Зарегистрирован: 2006-07-13
Сообщения: 774
Репутация: +  1  -
Профиль   Отправить e-mail  

Модуль zipfile, кодировки и пути

well
ZAN
В таком случае вот вариант:

import zipfile

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



Офлайн

#8 Апрель 26, 2008 20:41:08

umup
От:
Зарегистрирован: 2007-07-14
Сообщения: 53
Репутация: +  0  -
Профиль   Отправить e-mail  

Модуль zipfile, кодировки и пути

попробуйте (архивация всех файлов папки и разархивация дерева в папку, форматы zip,tar,gz,bz2) :

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

меньше всего проблем с кодировкой/путями - с bz2, в gz непонятно с путями в архиве (хотя разархивируется нормально), в zip - с кодировкой



Офлайн

#9 Апрель 27, 2008 11:33:14

ZAN
От:
Зарегистрирован: 2007-06-10
Сообщения: 403
Репутация: +  10  -
Профиль   Отправить e-mail  

Модуль zipfile, кодировки и пути

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



Офлайн

#10 Апрель 27, 2008 21:51:38

umup
От:
Зарегистрирован: 2007-07-14
Сообщения: 53
Репутация: +  0  -
Профиль   Отправить e-mail  

Модуль zipfile, кодировки и пути

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



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version