我有大量的数据(几场演出),我需要用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文件(没有条目)。有什么建议吗