官方地址
这是小型且无依赖的Python包,用于推断文件类型和 MIME 类型,检查文件或缓冲区的幻数签名
太多了,自己看吧,几乎常用文件都支持
支持的文件类型点我
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、可以检测一部分文件时候进行文件隐藏合并
pip install Pillow
from PIL import Image
img = Image.open('111.png') # 真实为jpg,改后缀为png了
print(img.format)
输出:
JPEG
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.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)