2017-02-14 311 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對我的評論中描述的問題。爲了您的目的,我在此調整了它,但我認爲可能只是更改chunk_str的編碼方式,以避免使用ByteIO。

反正 - 這裏是我的代碼,如果有幫助:

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 
相關問題