在对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文件时,它并不喜欢它。

...

zipcheck = zipfile.is_zipfile(zipselect)
if zipcheck is not None:
    print 'Input is not a zip file.'
    sys.exit(1)

...


结果是

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。

最佳答案

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

the zipfile.is_zipfile documentation

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

关于python - 验证来自stdin的zip文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6654940/

10-12 00:19
查看更多