相关疑难解决方法(0)

Python相当于使用管道将文件输出到Perl中的gzip

我需要弄清楚如何将文件输出写入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压缩来排除它.这部分是因为我听说使用同一模块进行解压缩也很慢.

python compression gzip pipe filehandle

9
推荐指数
2
解决办法
4252
查看次数

我可以在Python中使用带有Popen的已打开的gzip文件吗?

我有一个从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?

python scripting subprocess

6
推荐指数
1
解决办法
1293
查看次数

标签 统计

python ×2

compression ×1

filehandle ×1

gzip ×1

pipe ×1

scripting ×1

subprocess ×1