2017-02-14 3 views
2

Zipアーカイブに含まれるデータファイルから(ZipExtFileオブジェクト経由で)バイナリストリームにアクセスしようとしています。インクリメンタルアーカイブからテキストファイルオブジェクトを読み込むために、これはかなり簡単になります:Zipアーカイブ内のバイナリファイルをZipExtFileとして開きます

with ziparchive as ZipFile("myziparchive.zip", 'r'): 
    with txtfile as ziparchive.open("mybigtextfile.txt", 'r'): 
     for line in txtfile: 
      .... 

理想的にはバイトストリームと同等のようなものになるだろう:

残念ながら
with ziparchive as ZipFile("myziparchive.zip", 'r'): 
    with binfile as ziparchive.open("mybigbinary.bin", 'rb'): 
     while notEOF 
      binchunk = binfile.read(MYCHUNKSIZE) 
      .... 

ZipFile.openはしていないようですバイナリデータをZipExtFileオブジェクトに読み込むことができます。 docsから「R」 (デフォルト)、「U」または「のrU」

モードパラメータ、含まれている場合、次のいずれかでなければなりません。

この制約がある場合、バイナリファイルをアーカイブから直接インクリメンタルに読み込むにはどうすればよいですか?圧縮されていないファイルはかなり大きいので、最初に解凍しないでください。

+0

こんにちは!私はzipアーカイブからExcelファイルをopenpyxl load_workbook関数に渡そうとしているのと同じ問題を基本的に持っています。ただし、この関数はバイナリファイルオブジェクト(およびファイルパス)のみを受け入れます。私はこれを解決する方法の説明を見つけることができません。この問題を解決できましたか? – Fredrik

答えて

0

私はOPへの私のコメントで説明した問題を解決することができました。私はあなたの目的のためにここにそれを適用しましたが、ByteIOの使用を避けるためにchunk_strのエンコーディングを変更する方法がおそらくあると思います。とにかく

- それは場合に役立ちますここに私のコードは次のとおりです。

from io import BytesIO 
from zipfile import ZipFile 

MYCHUNKSIZE = 10 

archive_file = r"test_resources\0000232514_bom.zip" 
src_file = r"0000232514_bom.xls" 

no_of_chunks_to_read = 10 
with ZipFile(archive_file,'r') as zf: 
    with zf.open(src_file) as src_f: 
     while no_of_chunks_to_read > 0: 
      chunk_str = src_f.read(MYCHUNKSIZE) 
      chunk_stream = BytesIO(chunk_str) 
      chunk_bytes = chunk_stream.read() 
      print type(chunk_bytes), len(chunk_bytes), chunk_bytes 
      if len(chunk_str) < MYCHUNKSIZE: 
       # End of file 
       break 
      no_of_chunks_to_read -= 1 
関連する問題