在zip归档文件中打开二进制文件作为ZipExtFile

4

我正在尝试从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对象中。从文档中可以看到:

如果包含mode参数,则必须是以下之一:'r'(默认值),'U'或'rU'。

鉴于此限制,如何最好地从存档文件直接逐步读取二进制文件? 由于未压缩的文件相当大,因此我希望避免首先提取它。

你好!我基本上有同样的问题,因为我正在尝试从zip归档中传递一个Excel文件到openpyxl load_workbook函数。然而,这个函数只接受二进制文件对象(和文件路径)。我找不到如何解决这个问题的描述。你成功解决了这个问题吗? - Fredrik
2个回答

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

0

逐行阅读:

with ZipFile("myziparchive.zip", 'r') as ziparchive:
    with ziparchive.open("mybigtextfile.txt", 'r') as binfile:
       for line in binfile:
           line = line.decode()  # bytes to str
           ...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接