Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 11, 2013 11:21:29

heso
Зарегистрирован: 2013-11-10
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

работа с Zip

Есть ли возможность с помощью уже имеющегося в python модуля Zipfile заменить файл в архиве?
Пока все попытки не увенчались успехом:

В данном случае в архиве рядом с существующим файлом resources.arsc создается новый, не заменяя его:

import zipfile
sys1 = zipfile.ZipFile('SystemUI.apk', 'a')
sys1.write('resources.arsc','resources.arsc')
sys1.close()

А в данном, файл resources.arsc заменяет абсолютно все файлы в архиве, чего совершенно не нужно:
import zipfile
sys1 = zipfile.ZipFile('SystemUI.apk', 'w')
sys1.write('resources.arsc','resources.arsc')
sys1.close()

Как вариант, конечно, можно полностью извлечь содержимое всего архива и играться уже с ним, а потом заархивировать обратно, но очень не хотелось бы прибегать к этому(т.к при архивации у разных элементов в архиве должна быть разная степень сжатия).

Отредактировано heso (Ноя. 11, 2013 11:22:08)

Офлайн

#2 Ноя. 11, 2013 12:33:03

sanodin
От:
Зарегистрирован: 2011-06-16
Сообщения: 515
Репутация: +  31  -
Профиль   Отправить e-mail  

работа с Zip

# coding: utf8
from zipfile import ZipFile
zin = ZipFile('1.zip', 'w')
zout = ZipFile('1.zip', 'w')
for item in zin.infolist():
    buf = zin.read(item)
    if item != 'check.txt':
        zout.writestr(item, buf)
zin.close()
# Добавление файла в архив
zout.write('1.zip', 'z.txt')
# Добавление буфера/строки в архив как файл
#zout.writestr('check.txt', 'buffer with data')
zout.close()
но здесь перезапись архива, но вроде, не помню, можно добавлять параметр сжатия

Отредактировано sanodin (Ноя. 11, 2013 13:05:27)

Офлайн

#3 Ноя. 11, 2013 16:02:49

heso
Зарегистрирован: 2013-11-10
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

работа с Zip

sanodin
но здесь перезапись архива
В том и дело. По сути мог бы, как говорил, распаковать в отдельную папку - там поудалять ненужное, и обратно упаковать.
Сжатие можно добавлять с помощью констант ZIP_STORED/ZIP_DEFLATED/ZIP_BZIP2/ZIP_LZMA
В итоге решил сделать все через костыль:
pd = subprocess.Popen(['путь до 7z.exe', 'a', 'SystemUI.zip', '-mx0', './resources.arsc'], stdout=PIPE, stderr=PIPE)
stdout, stderr = pd.communicate()

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version