Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 18, 2022 13:09:33

Diana
Зарегистрирован: 2022-04-18
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Открыть архив внутри архива

Привет, всем!

Пытаюсь прочесть файл в архиве, который находится в другом архиве (матрешка по своему). Ниже на картинке содержание архива. Документ, который нужно прочесть - “document.txt”.



Как это лучше всего сделать? Пыталась использовать след. код, но ничего не работает:

 import zipfile
with zipfile.ZipFile("archive.zip", mode="r") as archive:
    with zipfile.ZipFile("archive2.zip", mode="r") as archive2:
        text = archive2.read("document.txt")
        print(text) #FileNotFountError: [Errno 2] No such file or directory: 'archive2.zip'

Прикреплённый файлы:
attachment archive.zip (5,8 KБ)

Офлайн

#2 Апрель 18, 2022 13:43:05

snakeous
Зарегистрирован: 2021-04-25
Сообщения: 9
Репутация: +  0  -
Профиль  

Открыть архив внутри архива

Diana
Как это лучше всего сделать? Пыталась использовать след. код, но ничего не работает:
 import io
import zipfile
with zipfile.ZipFile('archive.zip') as z:
    with z.open('archive2.zip') as z2:
        with zipfile.ZipFile(io.BytesIO(z2.read())) as nested_zip:
            text = nested_zip.open('document.txt').read()
            print(text)



——————————————————————
Я новичок в Python, не судите строго :)

Офлайн

#3 Апрель 19, 2022 22:40:37

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10022
Репутация: +  857  -
Профиль   Отправить e-mail  

Открыть архив внутри архива

Diana
Как это лучше всего сделать?
Лучше распаковать архив во временную директорию на диске. И так можно распаковывать и распаковывать, пока не будет получен нужный файл. А городить огород постоянно не получиться, так как когда-нибудь и десятикратное вложение появится.



Офлайн

#4 Апрель 20, 2022 13:28:27

Diana
Зарегистрирован: 2022-04-18
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Открыть архив внутри архива

py.user.next
Спасибо за совет. Как лучше свего это сделать? Распаковать временно (получается дважды), а потом и удалить его.

Офлайн

#5 Апрель 20, 2022 13:31:42

Diana
Зарегистрирован: 2022-04-18
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Открыть архив внутри архива

snakeous
Спасибо. Ваш код действительно работает, правда теперь проблема с чтением .xml файла. Пробовала сделать следующим образом, но не работает.

 import io
import zipfile
import xml.etree.ElementTree as ET
with zipfile.ZipFile('archive.zip') as z:
    with z.open('archive2.zip') as z2:
        with zipfile.ZipFile(io.BytesIO(z2.read())) as nested_zip:
            tree = ET.parse(nested_zip.open("document.xml"))
            root = tree.getroot()

Офлайн

#6 Апрель 20, 2022 15:00:47

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10022
Репутация: +  857  -
Профиль   Отправить e-mail  

Открыть архив внутри архива

Diana
Как лучше свего это сделать? Распаковать временно (получается дважды), а потом и удалить его.
Прикрепил пример.
[guest@localhost subarch]$ ./subarch.py 
File text:
Привет!

End.
[guest@localhost subarch]$



Отредактировано py.user.next (Апрель 20, 2022 15:01:41)

Прикреплённый файлы:
attachment subarch.tar.gz (6,7 KБ)

Офлайн

#7 Апрель 22, 2022 17:52:05

snakeous
Зарегистрирован: 2021-04-25
Сообщения: 9
Репутация: +  0  -
Профиль  

Открыть архив внутри архива

Diana
Спасибо. Ваш код действительно работает, правда теперь проблема с чтением .xml файла. Пробовала сделать следующим образом, но не работает.
 tree = ET.parse(nested_zip.open("document.xml"))
root = tree.getroot()
заменить на
 root = ET.fromstring(nested_zip.open("document.xml").read())
Также по вложении код от py.user.next, адаптированный для XML.



——————————————————————
Я новичок в Python, не судите строго :)

Отредактировано snakeous (Апрель 22, 2022 17:52:22)

Прикреплённый файлы:
attachment subarch_xml.tar.gz (6,7 KБ)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version