Найти - Пользователи
Полная версия: работа с Zip
Начало » Python для новичков » работа с Zip
1
heso
Есть ли возможность с помощью уже имеющегося в 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()

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

sanodin
# 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()
но здесь перезапись архива, но вроде, не помню, можно добавлять параметр сжатия
heso
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()
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