将文件一起作为Python中的可迭代文件?

时间:2011-06-21 19:49:25

标签: python

我正在运行一个WSGI服务器,我写的部分API会返回一些(相当大的)文件以及有关它们的元数据。我想将文件tar / gzip一起保存带宽,因此只需要下载一个文件。由于WSGI允许您返回一个可迭代对象,因此我想返回一个iterable,它返回生成的tar.gz文件的块。

我的问题是在Python中以一种能够将输出流回用户的方式将tar / gzip文件放在一起的好方法是什么?

编辑:

下面详细说明我对Oben Sonne的回应,我将有一个如下功能:

def iter_file(f,chunk=32768): return iter(lambda: f.read(chunk), '')

这将允许我指定在将文件返回到WSGI服务器时从文件返回的块大小。

然后这是一个简单的问题:

return iter_file(subprocess.Popen(["tar", "-Ocz"] + files, stdout=subprocess.PIPE).stdout)

或者,如果我想返回一个文件:

return iter_file(open(filename, "rb"))

1 个答案:

答案 0 :(得分:2)

bz2模块提供顺序压缩。似乎zlib包也可以按顺序压缩数据。所以使用这些模块你可以:

  1. tar您的文件(不应该花那么长时间),
  2. binary mode
  3. 中迭代阅读档案
  4. 将读取块传递给顺序压缩函数,
  5. yield这些函数的压缩输出,因此它可能被其他组件(WSGI)迭代使用
  6. AFAIK Python的tar-API不支持顺序tar'ing(如果我错了,请纠正我)。但是如果你的文件太大而你需要按顺序tar,你可以使用subprocess模块在​​命令行上运行tar并以块的形式读取它的标准输出。在这种情况下,您还可以使用tar命令压缩数据。然后你只需要阅读子进程的标准输出并产生读取块。