![]() |
1
13
唯一的解决方案是重写它用于压缩文件以从缓冲区读取的方法。将其添加到标准库中是微不足道的;我有点惊讶它还没有完成。我想大家都同意整个界面需要彻底改革,这似乎阻碍了任何渐进式的改进。
|
![]() |
2
9
更改于 Python 3.5 (来自官方文件):已添加 support 写信给 无法辨认 溪流。
这意味着现在
这是一个简单的生成器:
您可以在线尝试此代码: https://repl.it/@IvanErgunov/zipfilegenerator
还有另一种方法可以创建一个没有
备注 Python Zipstream by allanlei 这是一种过时且不可靠的方式。这是在正式完成之前,试图添加对不可访问流的支持。 |
![]() |
3
7
我拿了 Chris B.'s answer 并创建了一个完整的解决方案。以下是其他人感兴趣的情况:
|
![]() |
4
3
gzip。GzipFile以gzip压缩的块写入数据,您可以根据从文件读取的行数设置块的大小。 例如:
|
![]() |
5
3
基本的压缩是由zlib.compressobj.ZipFile完成的(在MacOSX上的Python 2.5下似乎是编译的)。Python 2.3版本如下。 您可以看到,它将压缩文件构建为8k块。取出源文件信息很复杂,因为zip文件头中记录了许多源文件属性(如未压缩的大小)。
|
![]() |
6
1
一些(许多?大多数?)压缩算法基于查看整个系统的冗余 整个的 文件。 一些压缩库会根据哪种压缩算法对文件最有效来在几种压缩算法之间进行选择。 我相信ZipFile模块可以做到这一点,所以它希望看到整个文件,而不仅仅是一次查看一部分。 因此,它不适用于无法在内存中加载的生成器或文件。这就解释了Zipfile库的局限性。 |
![]() |
7
1
如果有人偶然发现了这个问题,这个问题在2017年仍然适用于Python 2.7,这里有一个真正的流式zip文件的工作解决方案,不需要像其他情况一样寻找输出。秘诀是设置通用位标志的第3位(参见 https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT 第4.3.9.1节)。 请注意,此实现将始终创建ZIP64样式的文件,允许流式处理任意大的文件。它包括一个丑陋的黑客,可以强制中央目录记录的zip64端,所以请注意,这将导致您的进程写入的所有zip文件都变成zip64风格。
|
![]() |
8
0
gzip库将采用类似文件的对象进行压缩。
您仍然需要提供一个标称文件名以包含在zip文件中,但您可以将数据源传递给fileobj。 (这个答案与Damnsweet的答案不同,因为重点应该放在增量读取的数据源上,而不是增量写入的压缩文件上。) 现在我看到原来的提问者不会接受Gzip:-( |
![]() |
9
0
现在,使用python 2.7,您可以将数据添加到zip文件而不是文件中: http://docs.python.org/2/library/zipfile#zipfile.ZipFile.writestr |
![]() |
10
0
现在是2017年。如果您仍然希望优雅地完成此操作,请使用 Python Zipstream by allanlei . 到目前为止,它可能是唯一一个写得很好的库。 |