2011-07-10 29 views
7

Có cách nào chung để phát hiện xem tệp có là hình ảnh hay không (jpg, bmp, png, v.v.)Phát hiện xem tệp có phải là hình ảnh trong Python

Hoặc đang tạo danh sách các phần mở rộng tệp và làm một so sánh từng người một theo cách duy nhất?

+1

Theo các loại tệp python chuẩn http://docs.python.org/c-api/concrete.html tệp hình ảnh không phải là tiêu chuẩn, vì vậy tôi giả sử một số mô-đun bên ngoài sẽ được yêu cầu. – timonti

+2

Sử dụng mô-đun 'imghdr'. Xem [Cách kiểm tra xem tệp có phải là tệp hình ảnh hợp lệ không?] (Http://stackoverflow.com/questions/889333/how-to-check-if-a-file-is-a-valid-image-file) –

Trả lời

1

Bạn nên sử dụng thư viện cho việc này. Lưu ý rằng phần mở rộng! = Loại tệp, vì bạn có thể thay đổi phần mở rộng thành tệp .jpg, mở nó bằng sơn và sơn sẽ diễn giải nó như một jpeg (ví dụ). Bạn nên kiểm tra How to find the mime type of a file in python?.

+2

Điều này đã được đề cập - đây phải là nhận xét, không phải là câu trả lời –

18

Giả sử:

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

Và họ là bộ phim và hình ảnh thích hợp tập tin trong thư mục script.

Bạn có thể sử dụng mô-đun mimetypes dựng sẵn nhưng sẽ không hoạt động nếu không có tiện ích mở rộng.

>>> 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)} 

Hoặc gọi lệnh unix file. Này hoạt động mà không cần mở rộng, nhưng không phải trong 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;'} 

Hoặc bạn cố gắng để mở nó với PIL, và kiểm tra lỗi, nhưng cần PIL cài đặt:

>>> 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} 

Hoặc, vì đơn giản, như bạn nói rằng, chỉ cần kiểm tra tiện ích mở rộng, đó là cách tốt nhất tôi nghĩ.

>>> 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 lưu ý cho những người khác rằng việc sử dụng 'tệp' hoặc tùy chọn hai hoạt động tốt nhất cho trường hợp sử dụng của tôi, nơi tôi thu thập dữ liệu truy xuất hình ảnh đã được trả về mở rộng và cần lưu chúng dưới dạng .jpg/.png – matchew

+0

Ngoài ra còn có một cách dễ dàng để thực hiện điều này .... "nếu 'tệp' trong request.files:" hãy thử điều này nếu có tệp thì nó sẽ trả về true. . –

Các vấn đề liên quan