python – 使用gzip文件作为stdin,用于使用subprocess.call执行
发布时间:2020-12-20 13:17:28 所属栏目:Python 来源:网络整理
导读:我有一个 python脚本,使用subprocess.call()执行多个命令.我需要使用stdin将数据从gzip压缩文件传递给其中一个命令,但无论我做什么,该命令显然都会获取gzip压缩数据. 这是我认为应该工作的: import gzipfrom subprocess import callin_fname = 'test.gz'out
我有一个
python脚本,使用subprocess.call()执行多个命令.我需要使用stdin将数据从gzip压缩文件传递给其中一个命令,但无论我做什么,该命令显然都会获取gzip压缩数据.
这是我认为应该工作的: import gzip from subprocess import call in_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中读取整个文件(它知道它已经压缩并将其解压缩),然后将字符串传递给子进程.我把解压缩的内容包裹在一个 import gzip from subprocess import Popen,PIPE in_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) 哪个有效.请注意,这需要将整个文件读入内存,这可能是真正大文件的问题. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |