当前位置: 首页 > 面试题库 >

在Python中从生成器创建zip文件?

谭灿
2023-03-14
问题内容

我有大量的数据(几场演出),我需要用Python编写一个zip文件。我无法一次全部将其加载到内存中以传递给ZipFile的.writestr方法,我真的不想使用临时文件将其全部馈入磁盘,然后再读回。

有没有办法将生成器或类似文件的对象提供给ZipFile库?还是由于某种原因似乎不支持此功能

压缩文件是指压缩文件。如Python zipfile包中所支持。


问题答案:

唯一的解决方案是重写用于压缩文件以从缓冲区读取的方法。将其添加到标准库中是微不足道的。我很惊讶它还没有完成。我收集到很多共识,需要对整个界面进行大修,这似乎阻碍了任何增量改进。

import zipfile, zlib, binascii, struct
class BufferedZipFile(zipfile.ZipFile):
    def writebuffered(self, zipinfo, buffer):
        zinfo = zipinfo

        zinfo.file_size = file_size = 0
        zinfo.flag_bits = 0x00
        zinfo.header_offset = self.fp.tell()

        self._writecheck(zinfo)
        self._didModify = True

        zinfo.CRC = CRC = 0
        zinfo.compress_size = compress_size = 0
        self.fp.write(zinfo.FileHeader())
        if zinfo.compress_type == zipfile.ZIP_DEFLATED:
            cmpr = zlib.compressobj(zlib.Z_DEFAULT_COMPRESSION, zlib.DEFLATED, -15)
        else:
            cmpr = None

        while True:
            buf = buffer.read(1024 * 8)
            if not buf:
                break

            file_size = file_size + len(buf)
            CRC = binascii.crc32(buf, CRC) & 0xffffffff
            if cmpr:
                buf = cmpr.compress(buf)
                compress_size = compress_size + len(buf)

            self.fp.write(buf)

        if cmpr:
            buf = cmpr.flush()
            compress_size = compress_size + len(buf)
            self.fp.write(buf)
            zinfo.compress_size = compress_size
        else:
            zinfo.compress_size = file_size

        zinfo.CRC = CRC
        zinfo.file_size = file_size

        position = self.fp.tell()
        self.fp.seek(zinfo.header_offset + 14, 0)
        self.fp.write(struct.pack("<LLL", zinfo.CRC, zinfo.compress_size, zinfo.file_size))
        self.fp.seek(position, 0)
        self.filelist.append(zinfo)
        self.NameToInfo[zinfo.filename] = zinfo


 类似资料:
  • 问题内容: 这是我用来创建带有密码的文件的代码 但是它设置密码而不是密码,符号将被忽略。为什么? 问题答案: ^字符是命令外壳程序中的转义字符。尝试加倍。

  • 问题内容: 我创建了一个元组生成器,该元组生成器从仅过滤感兴趣记录的文件中提取信息,并将其转换为生成器返回的元组。 我尝试从创建数据框: 但是抛出一个错误: 我设法让它使用列表中的生成器,但是使用了两次内存: 我要加载的文件很大,内存消耗很重要。我的计算机的最后一次尝试花了两个小时来尝试增加虚拟内存:( 问题: 有人知道直接从记录生成器创建DataFrame的方法,而无需事先将其转换为列表吗? 注

  • 我试图在ZIP文件内创建一个ZIP文件,以重新构建以前在内存中的zip结构,我在Java。 我失败了,因为我得到了一个错误的内部ZIP内创建的初始ZIP文件。文件已损坏。当试图打开它时,我得到一个“文件的意外结局”。 我得到了这个结构: -input.zip--InnerInput.zip 代码使用java Stack和Map在内存中解压。然后它创建input2.zip,内部nput.zip。 总

  • 问题内容: 我正在尝试将 文件 从 一个文件夹 保存到 另一个 文件夹 。 zip文件夹 放置在其他目录中。而且我编写了以下代码: archive.php 但是可惜我无法创建.zip文件夹。我错过了任何一步吗? 问题答案: TEST是您的项目文件夹名称。 您可以根据需要定义路径。

  • 问题内容: 与此jar命令等效的Java是什么: 我想以编程方式创建此jar文件,因为我不确定命令是否位于我可以运行外部进程的系统路径上。 编辑 :我只想存档(和压缩)目录。不必遵循任何Java标准。即:标准拉链就可以了。 问题答案: // These are the files to include in the ZIP file String[] source = new String[]{“

  • 我尝试了多种方法来创建这个zip文件在Java /Groovy.我尝试的前几个方法,来自各种博客/帖子,导致无法打开损坏的zip文件。所以,我尝试了这个(下图),看起来相当有希望。系统报告传递到FileInputStream的有效文件路径。我不确定是否是FQ路径被传递到ZipOutputStream导致了这个问题。不管怎样,下面是代码,它导致创建小(188kb)zip文件(没有条目)。有什么建议吗