Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 6, 2012 11:28:44

grok
От:
Зарегистрирован: 2010-09-09
Сообщения: 74
Репутация: +  0  -
Профиль   Отправить e-mail  

Сжатие tar-файла

Доброго времени суток.
Ситуация следующая:
Создаю объект TarFile с аргументом fileobj=StringIO.StringIO() и добавляю туда необходимые мне файлы, т.е. все данные записываются не на диск, а в объект файла. Подскажите, как теперь сжать посредством zlib.compress() данный объект tarfile.TarFile? Другое дело было, если бы я сжимал его, открыв и прочитав данный файл с диска, типа:

import zlib, tarfile, StringIO
tf = open('t.tar', 'r').read()
zl = zlib.compress(tf)

Как быть, если объект файла берется из памяти?
import zlib, tarfile, StringIO
tf = tarfile.open(mode='w', fileobj=StringIO.StringIO())
tf.add('file_one')
tf.add('file_two')
...
tf.close()
zl = zlib.compress(???)
Спасибо.



Офлайн

#2 Июнь 6, 2012 12:40:50

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Сжатие tar-файла

Как-то так:

fileobj = StringIO.StringIO()
tf = tarfile.open(mode='w', fileobj=fileobj)
...
tf.close()
fileobj.seek(0)
zl = zlib.compress(fileobj.read())



Офлайн

#3 Июнь 6, 2012 12:47:44

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Сжатие tar-файла

А tarfile.open(mode='w:gz', …) не сделает тоже самое, что вы хотите?



Офлайн

#4 Июнь 6, 2012 13:14:59

grok
От:
Зарегистрирован: 2010-09-09
Сообщения: 74
Репутация: +  0  -
Профиль   Отправить e-mail  

Сжатие tar-файла

Ed
Как-то так:
fileobj = StringIO.StringIO()
tf = tarfile.open(mode='w', fileobj=fileobj)
...
tf.close()
fileobj.seek(0)
zl = zlib.compress(fileobj.read())
Большое спасибо!
Ed
А tarfile.open(mode='w:gz', …) не сделает тоже самое, что вы хотите?
zlib на 1,5/2 в моих результатах показал себя шустрее, чем тот же 'w:gz' + мне важно выбирать степень сжатия данных, а в 'w:gz' по-умолчанию, как я понял, идет максимальная степень сжатия, т.е. 9.



Отредактировано grok (Июнь 6, 2012 13:17:51)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version