2017-02-14 1 views
2

Zip 아카이브에 포함 된 데이터 파일에서 (ZipExtFile 개체를 통해) 이진 스트림에 액세스하려고합니다. 점진적으로 아카이브에서 텍스트 파일 오브젝트에 읽으려면이 매우 간단합니다 :Zip 보관 파일의 이진 파일을 ZipExtFile로 엽니 다.

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

불행하게도, ZipFile.open가 보이지 않는다 :

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

이상적으로 바이트 스트림에 상응 같은 것을 할 것 바이너리 데이터를 ZipExtFile 객체로 읽는 것을 지원합니다. docs에서 'R' (기본값), 'U', 또는 'RU'

모드 매개 변수에 포함 된 경우, 다음 중 하나를해야합니다.

이 제한 사항이 주어지면 아카이브에서 직접 2 진 파일을 점진적으로 읽는 것이 가장 좋습니다. 압축되지 않은 파일이 꽤 크기 때문에 먼저 압축을 풀지 않으려합니다.

+0

안녕하세요! zip 아카이브에서 Excel 파일을 openpyxl load_workbook 함수로 전달하려고 할 때 기본적으로 동일한 문제가 있습니다. 그러나이 함수는 이진 파일 객체 (및 파일 경로) 만 허용합니다. 이 문제를 해결하는 방법에 대한 설명을 찾을 수 없습니다. 이 문제를 해결할 수 있었습니까? – Fredrik

답변

0

나는 OP에 대한 나의 의견에서 설명한 문제를 해결할 수있었습니다. 귀하의 목적에 맞게 여기에 적용했지만, 아마도 ByteIO를 사용하지 않기 위해 chunk_str의 인코딩을 변경하는 방법이있을 것이라고 생각합니다.

어쨌든 - 여기 내 코드의 IT는 도움이된다면 :

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 
관련 문제