从标准输入验证压缩文件

2024-10-01 15:45:07 发布

您现在位置:Python中文网/ 问答频道 /正文

在对unzip(1L)感到失望之后,我一直在尝试创建一个脚本,该脚本将解压并打印出来自stdin的zip存档中的所有文件的原始数据。我目前有以下有效的方法:

import sys, zipfile, StringIO

stdin = StringIO.StringIO(sys.stdin.read())
zipselect = zipfile.ZipFile(stdin)

filelist = zipselect.namelist()
for filename in filelist:
    print filename, ':' 
    print zipselect.read(filename)

但是,当我试图添加验证来检查它是否真的是一个zip文件时,它并不喜欢它。在

^{pr2}$

结果

File "/home/chris/simple/zipcat/zipcat.py", line 13, in <module>
  zipcheck = zipfile.is_zipfile(zipselect)
File "/usr/lib/python2.7/zipfile.py", line 149, in is_zipfile
  result = _check_zipfile(fp=filename)
File "/usr/lib/python2.7/zipfile.py", line 135, in _check_zipfile
  if _EndRecData(fp):
File "/usr/lib/python2.7/zipfile.py", line 203, in _EndRecData
  fpin.seek(0, 2)
AttributeError: ZipFile instance has no attribute 'seek'

我想它不能搜索是因为它不是一个文件,就这样?在

抱歉,如果这很明显,这是我第一次使用Python。在


Tags: 文件inpy脚本libusrstdinsys
3条回答

您应该将stdin传递给is_zipfile,而不是{}。is_zipfile采用文件或文件对象的路径,而不是ZipFile。在

the zipfile.is_zipfile documentation

ZipFile不能查找是因为它不是文件,这是正确的。它是一个归档文件,所以它可以包含许多文件。在

完全在记忆中做这件事需要做一些工作。AttributeError消息表示is_zipfile方法正在尝试使用您提供的文件句柄的seek方法。但是标准输入是不可查找的,因此它的file对象没有seek方法。在

如果你真的,真的不能在磁盘上临时存储文件,那么你可以在内存中缓冲整个文件(你需要为安全性强制一个大小限制),然后实现一些“duck”代码,它看起来和行为像一个可查找的文件对象,但实际上只使用内存中的字节字符串。在

有可能您可以欺骗并缓冲足够的数据,is_zipfile来完成它的工作,但是我似乎记得ZIP的目录在文件的末尾。但我可能错了。在

你2011年的Python碎片是:StringIO.StringIO(系统标准读取())

2018年,python3程序员可能会这样说:斯金吉奥(...). 在

你想要的是下面的Python碎片:拜特西奥(...). 当然,当我使用requests模块从web服务器下载二进制ZIP文件时,这对我来说非常有用:

zf = zipfile.ZipFile(io.BytesIO(req.content))

相关问题 更多 >

    热门问题