在Python中从HTTP响应中提取Zip

2024-10-02 22:28:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我能够从HTTPs响应中获取zip,并使用以下代码片段将其存储在特定文件夹中:

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

但是,在/pathtostore中,zip文件被提取出来时使用了一些随机名称。有没有办法控制解压时创建的zip文件的名称

目前,zip解压缩后,目录结构如下:

/pathtostore/ZaXyzzz

——>;Zaxyzz是邮政编码

我正在寻找以下内容:

/pathtostore/1234_2020_03_02

——>;1234_2020_03_02(cid_curdate)是我想要的邮政编码

PS:我无法读取zip并将其重命名,因为/pathtostore中可能存在多个zip


Tags: 文件代码httpsiogt文件夹名称zip
2条回答

您可以读取zipfile的ZipInfo结构,并修改其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)

您可以获取名称z.namelist()并分别读取每个文件z.read(),然后使用标准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)

相关问题 更多 >