Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将文件从ZIP直接解压缩到另一个ZIP_Python_Python 3.x_Archive_Zipfile - Fatal编程技术网

Python 将文件从ZIP直接解压缩到另一个ZIP

Python 将文件从ZIP直接解压缩到另一个ZIP,python,python-3.x,archive,zipfile,Python,Python 3.x,Archive,Zipfile,我的目标是从Zip存档中提取某些文件,并将它们直接流式传输到另一个Zip,而无需对磁盘执行中间提取 到目前为止,我已经: from zipfile import ZipFile, ZIP_DEFLATED def stream_conents(src_zip, dst_zip, file_subset_list): with ZipFile(src_zip, "r", compression=ZIP_DEFLATED) as src_zip_archive: with

我的目标是从Zip存档中提取某些文件,并将它们直接流式传输到另一个Zip,而无需对磁盘执行中间提取

到目前为止,我已经:

from zipfile import ZipFile, ZIP_DEFLATED


def stream_conents(src_zip, dst_zip, file_subset_list):
    with ZipFile(src_zip, "r", compression=ZIP_DEFLATED) as src_zip_archive:
        with ZipFile(dst_zip, "w", compression=ZIP_DEFLATED) as dst_zip_archive:
            for zitem in src_zip_archive.namelist():
                if zitem in file_subset_list:
                    zitem_object = src_zip_archive.open(zitem)
                    dst_zip_archive.write(zitem_object, zitem, )

但它只是抛出了
TypeError:参数应该是字符串、字节或整数,而不是ZipExtFile

您可以将整个文件读入内存,并使用
writestr
写入存档文件

def stream_conents(src_zip, dst_zip, file_subset_list):
    with ZipFile(src_zip, "r", compression=ZIP_DEFLATED) as src_zip_archive:
        with ZipFile(dst_zip, "w", compression=ZIP_DEFLATED) as dst_zip_archive:
            for zitem in src_zip_archive.namelist():
                if zitem in file_subset_list:
                    # warning, may blow up memory
                    dst_zip_archive.writestr(zitem,
                        src_zip_archive.read(zitem))
从python 3.6开始,
ZipFile.open
将以写入模式打开归档文件。这样可以将文件分块写入,并减少总体内存使用

def stream_conents(src_zip, dst_zip, file_subset_list):
    with ZipFile(src_zip, "r", compression=ZIP_DEFLATED) as src_zip_archive:
        with ZipFile(dst_zip, "w", compression=ZIP_DEFLATED) as dst_zip_archive:
            for zitem in src_zip_archive.namelist():
                if zitem in file_subset_list:
                    if sys.version_info >= (3, 6):
                        with src_zip_archive.open(zitem) as from_item:
                            with dst_zip_archive.open(zitem, "w") as to_item:
                                shutil.copyfileobj(from_item, to_item)
                    else:
                        # warning, may blow up memory
                        dst_zip_archive.writestr(zitem, 
                            src_zip_archive.read(zitem))

你就不能复制zip文件吗?@Okx不,因为我只想从
file\u subset\u list