python如何检测文件或图片类型

python如何检测文件或图片类型

    • 一、检测文件类型
      • 简介
      • 特点
      • 支持的文件类型
      • 安装
      • 使用
    • 二、图片格式检测
      • 一、PIL模块
        • 安装
        • 使用1:本地图片
        • 使用2:base64格式图片
      • 二、 imghdr模块
        • 唯一一个API
        • 支持的类型
        • 简单使用——本地图片
        • 简单使用——爬虫网络图片

一、检测文件类型

简介

官方地址

这是小型且无依赖的Python包,用于推断文件类型和 MIME 类型,检查文件或缓冲区的幻数签名

特点

  • 简单友好的API
  • 支持多种文件类型
  • 提供文件扩展名和 MIME 类型推断
  • 按扩展名或 MIME 类型发现文件
  • 按种类发现文件(图像、视频、音频……)
  • Pluggable : 添加新的自定义类型匹配器
  • 快速,甚至处理大文件 只需要代表最大文件头的前
  • 261 个字节,
  • 因此您只需传递一个字节列表
  • 无依赖(只有 Python 代码,没有 C 扩展,没有 libmagic 绑定)
  • 跨平台文件识别

支持的文件类型

太多了,自己看吧,几乎常用文件都支持

支持的文件类型点我

安装

pip install filetype

使用

import filetype

def main(filename):
    kind = filetype.guess(filename)
    if kind is None:
        print('Cannot guess file type!')
        return

    print('File extension: %s' % kind.extension)
    print('File MIME type: %s' % kind.mime)

if __name__ == '__main__':
    main('111.png')

输出:

File extension: jpg
File MIME type: image/jpeg

为什么,我的文件是png图片,检测出来是jpg格式呢?模块当然没问题,只是我手动更改了文件后缀,所以此模块还有一个用途:
文件真实格式检测
1、可以检测是否篡改了文件后缀,例如图片文件
2、可以检测一部分文件时候进行文件隐藏合并

二、图片格式检测

一、PIL模块

安装

pip install Pillow

使用1:本地图片

from PIL import Image

img = Image.open('111.png')  # 真实为jpg,改后缀为png了
print(img.format)

输出:

JPEG

使用2:base64格式图片

import io
import base64
from PIL import Image

img_base64 = '这里填写图片base64编码'
img_byte = base64.b64decode(img_base64.encode())
img_io = io.BytesIO(img_byte)
img = Image.open(img_io)
print(img.format)

输出:

JPEG

二、 imghdr模块

功能描述:imghdr模块用于识别图片的格式。它通过检测文件的前几个字节,从而判断图片的格式。

唯一一个API

imghdr.what(file, h=None)

第一个参数file可以是用rb模式打开的file对象或者表示路径的字符串和PathLike对象。
第二个参数:h参数是字节。
函数返回表示图片格式的字符串。

支持的类型

返回值 描述 检测方式
jpeg 用JFIF或者Exif格式保存的JPEG图片 第7到第10个字节是b’JFIF’或者b’Exif’
png 可移植网络图形格式(Portable Network Graphic Format) 以字节串b’\x89PNG\r\n\x1a\n’开头
gif GIF(Graphics Interchange Format)的87版本和89版本 前6个字节为b’GIF87a’或者b’GIF89a’
tiff TIFF(Tag Image File Format)的两种字节顺序 前两个字节为b’MM’或者b’II’
rgb SGI ImgLib 以字节串b’\x01\xda’开头
pbm Portable Bitmap 第1个字节为b’P’,第2个字节为b’1’或b’4’,第3个字节为b’\t’或b’\n’或b’\r’
pgm Portable Graymap Files 第1个字节为b’P’,第2个字节为b’2’或b’5’,第3个字节为b’\t’或b’\n’或b’\r’
ppm Portable Pixmap Files 第1个字节为b’P’,第2个字节为b’3’或b’6’,第3个字节为b’\t’或b’\n’或b’\r’
rast Sun Raster 以字节串b’\x59\xA6\x6A\x95’开头
xbm X Bitmap Files 以字节串b’#define ‘开头
bmp Bitmap,Windows标准图像文件格式 以字节串b’BM’开头
webp 谷歌的WebP格式,Python3.5加入 以字节串b’RIFF’开头并且第9到第12个字节为b’WEBP’
exr OpenEXR,Python3.5加入 以字节串b’\x76\x2f\x31\x01’开头

简单使用——本地图片

import imghdr
imghdr.what('test.jpg')

输出:

jpeg

简单使用——爬虫网络图片

在写爬虫的时候如果爬取图片的话,在保存的时候我们需要知道图片的格式,不然gif的保存为了png什么的就动不起来了,但是有一些图片的格式是不太容易由url中识别出来的,比如有些图片的url是这个样子的:

http://www.xx.com/bar.png?element=bar

像这种要做后缀截取的话需要考虑很多情况,所以这个时候imghdr就派上用场了。

import imghdr
import uuid

import requests

url = 'xxxx'
response = requests.get(url)
save_name = uuid.uuid1().hex + "." + imghdr.what(None, response.content)  # python中uuid来生成机器唯一标识
print(save_name)
with open(save_name, 'wb') as img_file:
    img_file.write(response.content)

你可能感兴趣的:(python,爬虫,python,开发语言,opencv)