Извлечение Zip из ответа HTTP в Python - PullRequest
0 голосов
/ 02 марта 2020

Я могу получить почтовый индекс из HTTP-ответа и сохранить его в указанной папке c, используя следующий фрагмент кода:

z = zipfile.ZipFile(io.BytesIO(statement_resp.content))
z.extractall("/pathtostore")

Однако в /pathtostore zip-файл получает извлекается со случайным именем . Есть ли способ управления именами zip-файлов, создаваемых при извлечении самого себя?

В настоящее время после распаковки zip ниже представлена ​​структура каталогов:

/ pathtostore / ZaXyzzz

-> ZaXyzzz - это имя почтового индекса.

Я ищу что-то, как показано ниже:

/ pathtostore / 1234_2020_03_02

-> 1234_2020_03_02 (cid_curdate) - это имя zip, которое я хочу.

PS: я не могу прочитать zip и переименовать его, поскольку внутри /pathtostore

может быть несколько zip

Ответы [ 2 ]

0 голосов
/ 02 марта 2020

Вы можете прочитать структуры ZipInfo zipfile и изменить его атрибут filename для записи

from pathlib import Path

z = zipfile.ZipFile(io.BytesIO(statement_resp.content))
for info in z.getinfo():
    # implement your extraction policy here. Remove root
    # path name and add our own
    zip_path = Path(z.filename)
    z.filename = str(Path("1234_2020_03_02").joinpath(*zip_path.parts[1:]))
    x.extract(info)
0 голосов
/ 02 марта 2020

Вы можете получить имена z.namelist() и прочитать каждый файл отдельно z.read() и написать его с новым именем, используя standarad open(), write(), close()

Минимальный пример.

Может потребоваться больше кода, если в zipfile есть папки

import zipfile
import datetime
import os

z = zipfile.ZipFile('input.zip')

folder = '/pathtostore'
os.makedirs(folder, exist_ok=True)

today = datetime.date.today().strftime('%Y_%m_%d')
cid = 0

for old_name in z.namelist():

    cid += 1
    new_name = os.path.join(folder, '{:04}_{}'.format(cid, today))

    print(old_name, '->', new_name)

    data = z.read(old_name)

    with open(new_name, 'wb') as fh:
        fh.write(data)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...