我需要弄清楚如何将文件输出写入Python中的压缩文件,类似于下面的双线程:
open ZIPPED, "| gzip -c > zipped.gz";
print ZIPPED "Hello world\n";
Run Code Online (Sandbox Code Playgroud)
在Perl中,这使用Unix gzip将打印到ZIPPED文件句柄的任何内容压缩到文件"zipped.gz".
我知道如何使用"import gzip"在Python中执行此操作,如下所示:
import gzip
zipped = gzip.open("zipped.gz", 'wb')
zipped.write("Hello world\n")
Run Code Online (Sandbox Code Playgroud)
但是,这非常缓慢.根据分析器,使用该方法占用了我运行时间的90%,因为我将200GB的未压缩数据写入各种输出文件.我知道文件系统可能是问题的一部分,但我想通过使用Unix/Linux压缩来排除它.这部分是因为我听说使用同一模块进行解压缩也很慢.
我有一个从stdin读取的命令行工具.在命令行上我会运行...
./foo < bar
Run Code Online (Sandbox Code Playgroud)
要么 ...
cat bar | ./foo
Run Code Online (Sandbox Code Playgroud)
使用gziped文件,我可以运行
zcat bar.gz | ./foo
Run Code Online (Sandbox Code Playgroud)
在Python我可以做...
Popen(["./foo", ], stdin=open('bar'), stdout=PIPE, stderr=PIPE)
Run Code Online (Sandbox Code Playgroud)
但我不能这样做
import gzip
Popen(["./foo", ], stdin=gzip.open('bar'), stdout=PIPE, stderr=PIPE)
Run Code Online (Sandbox Code Playgroud)
我最终不得不跑
p0 = Popen(["zcat", "bar"], stdout=PIPE, stderr=PIPE)
Popen(["./foo", ], stdin=p0.stdout, stdout=PIPE, stderr=PIPE)
Run Code Online (Sandbox Code Playgroud)
难道我做错了什么?为什么我不能使用gzip.open('bar')作为对Popen的stdin arg?