繁体   English   中英

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

[英]Open binary file in zip archive as 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 对象。 文档

模式参数(如果包含)必须是以下之一:“r”(默认值)、“U”或“rU”。

鉴于此约束,如何最好地直接从存档中增量读取二进制文件? 由于未压缩的文件非常大,我想避免先提取它。

我设法解决了我在对 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

逐行阅读:

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
           ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM