python - 不使用临时文件生成 zip 流

标签 python python-3.x stream compression zip

我有一个 python 方法需要从 API 收集大量数据,将其格式化为 CSV,压缩并将结果流回。

我一直在谷歌搜索,我能找到的每个解决方案都需要写入临时文件或将整个存档保存在内存中。

内存绝对不是一个选项,因为我很快就会出现 OOM。写入临时文件有很多与之相关的问题(这个盒子目前只使用磁盘记录日志,下载开始前的准备时间要长得多,文件清理问题等等)。更不用说它只是令人讨厌的事实。

我正在寻找一个可以让我做类似...的库

C = Compressor(outputstream)
C.BeginFile('Data.csv')
for D in Api.StreamResults():
    C.Write(D)
C.CloseFile()
C.Close()

换句话说,就是在我写入数据时写入输出流的东西。

我已经在 .Net 和 PHP 中做到了这一点 - 但我不知道如何在 Python 中实现它。

从长远来看,“大量”数据是指我需要能够处理多达 ~10 Gb 的(原始明文)数据。这是大数据系统导出/转储过程的一部分。

最佳答案

作为gzip module文档指出,您可以将类文件对象传递给 GzipFile 构造函数。 由于 python 是鸭子类型的,您可以自由实现自己的流,如下所示:

import sys
from gzip import GzipFile

class MyStream(object):
    def write(self, data):
        #write to your stream...
        sys.stdout.write(data) #stdout, for example

gz= GzipFile( fileobj=MyStream(), mode='w'  )
gz.write("something")

关于python - 不使用临时文件生成 zip 流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19118551/

相关文章:

python - 当我从 api (yfinance) 获取数据时,Numpy 数组缺少日期

python - flask : What exactly is @app

python - 什么时候发电机不是发电机?为什么有时用 yield 调用我的函数不返回生成器对象

python - 在 matplotlib 条形图中设置条形间距

带有发布数据的 php file_get_contents

javascript - 父类(super class)化stream.Duplex的问题

c# - 在 GUI 标签统一中显示带有特殊字符的 python 输出

python - 如何获取 QTreeWidget 中被单击的项目?

python - 如果 Pyramid session 是单向散列的而不是存储在服务器端,那么数据来自哪里?

C# - 逐字符读取外部 CSV 文件