2011-07-10 49 views
7

¿Hay alguna manera general, para detectar si un archivo es una imagen (jpg, bmp, png, etc ...)Detectar si un archivo es una imagen en Python

O está haciendo una lista de las extensiones de archivo y haciendo una comparación uno a uno de la única manera?

+1

De acuerdo con los tipos de archivo estándar de Python http://docs.python.org/c-api/concrete.html archivo de imagen no es estándar, así que supongo que será necesario algún módulo externo. – timonti

+2

Usa el módulo 'imghdr'. Consulte [Cómo verificar si un archivo es un archivo de imagen válido?] (Http://stackoverflow.com/questions/889333/how-to-check-if-a-file-is-a-valid-image-file) –

Respuesta

1

Debe utilizar una biblioteca para esto. Tenga en cuenta que la extensión! = Tipo de archivo, porque puede cambiar la extensión a un archivo .jpg, ábralo con pintura y paint lo interpretará como un jpeg (por ejemplo). Debería marcar How to find the mime type of a file in python?.

+2

Esto ya fue mencionado - esto debería ser un comentario, no una respuesta –

18

Suponiendo:

>>> files = {"a_movie.mkv", "an_image.png", "a_movie_without_extension", "an_image_without_extension"} 

Y son archivos de vídeo y de imagen adecuados en carpeta de scripts.

Puede usar el módulo de tipos mimet incorporado, pero no funcionará sin extensiones.

>>> import mimetypes 
>>> {file: mimetypes.guess_type(file) for file in files} 
{'a_movie_without_extension': (None, None), 'an_image.png': ('image/png', None), 'an_image_without_extension': (None, None), 'a_movie.mkv': (None, None)} 

O llamar al comando UNIX file. Esto funciona sin extensiones, pero no en Windows:

>>> import subprocess 
>>> def find_mime_with_file(path): 
...  command = "/usr/bin/file -i {0}".format(path) 
...  return subprocess.Popen(command, shell=True, stdout=subprocess.PIPE).communicate()[0].split()[1] 
... 
>>> {file: find_mime_with_file(file) for file in files} 
{'a_movie_without_extension': 'application/octet-stream;', 'an_image.png': 'image/png;', 'an_image_without_extension': 'image/png;', 'a_movie.mkv': 'application/octet-stream;'} 

o al intentar abrirlo con el PIL, y comprobar si hay errores, pero necesita PIL instalado:

>>> from PIL import Image 
>>> def check_image_with_pil(path): 
...  try: 
...   Image.open(path) 
...  except IOError: 
...   return False 
...  return True 
... 
>>> {file: check_image_with_pil(file) for file in files} 
{'a_movie_without_extension': False, 'an_image.png': True, 'an_image_without_extension': True, 'a_movie.mkv': False} 

O, por simplicidad, a medida que digamos, solo revisa las extensiones, es la mejor forma en que pienso.

>>> extensions = {".jpg", ".png", ".gif"} #etc 
>>> {file: any(file.endswith(ext) for ext in extensions) for file in files} 
{'a_movie_without_extension': False, 'an_image.png': True, 'an_image_without_extension': False, 'a_movie.mkv': False} 
+0

+1, señalando para otros que el uso de 'archivo' u opción dos funcionaba mejor para mi caso de uso en el que estaba rastreando recuperando imágenes que se devolvieron sin un extensión y necesita guardarlos como .jpg/.png – matchew

+0

También hay una manera fácil de hacerlo .... "if 'file' in request.files:" prueba esto si hay un archivo y luego devolverá true. . –

Cuestiones relacionadas