我有一个大的本地文件.我想使用该boto库将该文件的gzip压缩版本上传到S3 .该文件太大,无法在上载之前在磁盘上高效地进行gzip,因此在上传过程中应该以流式方式对其进行gzip压缩.
该boto库知道一个函数set_contents_from_file(),它需要一个类似文件的对象.
该gzip库知道GzipFile可以通过名为的参数获取对象的类fileobj; 它会在压缩时写入此对象.
我想结合这两个函数,但是一个API想要自己阅读,另一个API想要自己编写; 既不知道被动操作(如写入或被读取).
有没有人知道如何以工作方式结合这些?
编辑:我接受了一个答案(见下文),因为它暗示我要去哪里,但如果你有同样的问题,你可能会发现我自己的答案(也在下面)更有帮助,因为我实现了一个使用分段上传的解决方案.
如何遍历包含单个文本文件 (csv) 的 gzip 文件?
搜索 crates.io 我发现flate2有以下解压代码示例:
extern crate flate2;
use std::io::prelude::*;
use flate2::read::GzDecoder;
fn main() {
let mut d = GzDecoder::new("...".as_bytes()).unwrap();
let mut s = String::new();
d.read_to_string(&mut s).unwrap();
println!("{}", s);
}
Run Code Online (Sandbox Code Playgroud)
如何流式传输 gzip csv 文件?
我为压缩文件编写了一个函数如下:
def gzip(filename):
'''Gzip the given file and then remove original file.'''
r_file = open(filename, 'r')
w_file = gzip.GzipFile(filename + '.gz', 'w', 9)
w_file.write(r_file.read())
w_file.flush()
w_file.close()
r_file.close()
os.unlink(filename)
Run Code Online (Sandbox Code Playgroud)
但是,当我运行我的程序时,我收到错误:
'function'对象没有属性'GzipFile'.
我做错了什么?先谢谢!