这是我认为应该工作的:
import gzipfrom subprocess import callin_fname = 'test.gz'out_fname = 'test.txt'gz = gzip.open(in_fname,'rb')txt = open(out_fname,'w')call(['cat'],stdin=gz,stdout=txt)
但最后,’test.txt’被压缩并且与Gzip压缩输入文件具有完全相同的大小.
如果我调用gz.read(),那么我会按预期获得正确的解压缩数据.将Gzip压缩文件用作stdin需要做什么?
解决方法 在做了一些研究之后,问题的根源在于你的 *** 作系统不知道gzip文件的文件句柄是什么特别的事实.基本上,gzip提供了一个“类文件”接口,但子进程(在本例中为cat)并不知道这是一个需要解压缩的特殊文件.因此,它只读取字节的文件字节并打印出它读取的乱码.我的下一个想法是在python中读取整个文件(它知道它已经压缩并将其解压缩),然后将字符串传递给子进程.我把解压缩的内容包裹在一个StringIO
对象中,但事实证明这不起作用.另一个答案(Use StringIO as stdin with Popen)提到了一个稍微不同的子进程调用:
import gzipfrom subprocess import Popen,PIPEin_fname = 'test.gz'out_fname = 'test.txt'with gzip.open(in_fname,'rb') as f: gz = f.read()txt = open(out_fname,'w')process = Popen(['cat'],stdin=PIPE,stdout=txt)process.communicate(gz)
哪个有效.请注意,这需要将整个文件读入内存,这可能是真正大文件的问题.
总结以上是内存溢出为你收集整理的python – 使用gzip文件作为stdin,用于使用subprocess.call执行的命令全部内容,希望文章能够帮你解决python – 使用gzip文件作为stdin,用于使用subprocess.call执行的命令所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)