2017-02-17 20 views
2

私の目標は、Zipアーカイブから特定のファイルを抽出し、ディスクへの中間抽出をせずに別のZipに直接ストリーミングすることです。ZIPファイルを別の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: argument should be string, bytes or integer, not ZipExtFile

+0

zipファイルをコピーできません。 – Okx

+0

@Okx no、 'file_subset_list'から_certain_ファイルのみを抽出/ストリームしたいので – Vasily

答えて

2

あなたはファイル全体をメモリに読み込み、アーカイブを書き込むために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)) 
関連する問題