为什么模块“zipfile”的“is_zipfile”函数总是返回“false”?

时间:2013-01-05 16:53:42

标签: python

根据python文档zipfile.is_zipfile(filename)函数返回True如果filename是有效的ZIP文件,则返回False。

我编写了如下脚本,最初传递了一个参数,结果得到“False”,但对于其他有效的参数,我也一直得到False

脚本:

import zipfile

for filename in [ r'D:\Python_Programs\B1', r'D:\Python_Programs\B2', r'D:\Python_Programs\B1+B2\20130105\144145_1.zip', 'NEWS.txt']:
    print (filename, zipfile.is_zipfile(filename))

结果:

D:\Python_Programs\B1 False
D:\Python_Programs\B2 False
D:\Python_Programs\B1+B2\20130105\144145_1.zip False
NEWS.txt False

任何人都可以帮我解释为什么我每次都会得到假吗?

1 个答案:

答案 0 :(得分:0)

根据评论确定,is_zipfile正在返回False,因为该文件确实不是zip文件 - 它是伪装的RAR文件。文件扩展名可能会被无意中更改。 WinRAR能够处理zip和RAR文件,因此它可以打开文件,无论其实际扩展名如何,但只处理zip文件的程序无法打开它。

通常可以通过检查文件的前几个字节并查找各种所谓的魔术常量来识别文件类型。这正是Unix实用程序file(1)的目的。一个zip文件通常由两个魔术字节PK(更具体地,四个字节0​​x50 0x4B 0x74 0x08)标识,但是zip文件具有它们的特殊属性实际上由文件的 end 处的特定数据结构标识。其结果是一些有趣的隐写技术,如this trick。但是在实践中你不会经常看到 - 几乎所有(如果不是全部)标准zip工具都会创建以PK开头的zip文件。