如何检查一个文件是否是一个有效的图像文件?

我目前正在使用PIL。

import Image try: im=Image.open(filename) # do stuff except IOError: # filename not an image file 

然而,虽然这足以覆盖大多数情况下,一些图像文件,如xcf,svg和psd没有被检测到。 Psd文件抛出一个OverflowErrorexception。

有没有我可以包括他们呢?

很多时候,第一对夫妇的字符将成为各种文件格式的幻数。 除了上面的例外检查之外,你可以检查这个。

我刚刚find了内置的imghdr模块。 从python文档:

imghdr模块确定包含在文件或字节stream中的图像的types。

这是如何工作的:

 >>> import imghdr >>> imghdr.what('/tmp/bass') 'gif' 

使用模块比重新实现类似的function要好得多

除了Brianbuild议你可以使用PIL的validation方法来检查文件是否被破坏。

im.verify()

尝试确定文件是否被破坏,而不实际解码图像数据。 如果这种方法发现任何问题,就会引发合适的例外。 此方法仅适用于新打开的图像; 如果图像已经被加载,结果是不确定的。 此外,如果您在使用此方法后需要加载图像,则必须重新打开图像文件。 属性

您可以使用Python绑定到libmagic, python-magic ,然后检查MIMEtypes。 这不会告诉你,如果文件损坏或完好,但它应该能够确定它是什么types的图像。

那么,我不知道psd的内部,但我确定知道,事实上,svg本身不是一个图像文件,它是基于xml的,所以它本质上是一个纯文本文件。

在Linux上,你可以使用python-magic( http://pypi.python.org/pypi/python-magic/0.1 ),它使用libmagic来识别文件格式。

AFAIK,libmagic查看文件,并试图告诉你更多的不仅仅是格式,比如位图尺寸,格式版本等等。所以你可能会把这看作是对“有效性”的肤浅testing。

对于“有效”的其他定义,您可能需要编写自己的testing。

将检查文件扩展名是可以接受的,或者你试图确认数据本身代表一个图像文件?

如果可以检查文件扩展名,则可以使用正则expression式或简单的比较来满足要求。