python通过文件头判断文件类型


Posted in Python onOctober 30, 2015

对于提供上传的服务器,需要对上传的文件进行过滤。

本文为大家提供了python通过文件头判断文件类型的方法,避免不必要的麻烦。

分享代码如下

import struct 
 
# 支持文件类型 
# 用16进制字符串的目的是可以知道文件头是多少字节 
# 各种文件头的长度不一样,少半2字符,长则8字符 
def typeList(): 
  return { 
    "52617221": EXT_RAR, 
    "504B0304": EXT_ZIP} 
 
# 字节码转16进制字符串 
def bytes2hex(bytes): 
  num = len(bytes) 
  hexstr = u"" 
  for i in range(num): 
    t = u"%x" % bytes[i] 
    if len(t) % 2: 
      hexstr += u"0" 
    hexstr += t 
  return hexstr.upper() 
 
# 获取文件类型 
def filetype(filename): 
  binfile = open(filename, 'rb') # 必需二制字读取 
  tl = typeList() 
  ftype = 'unknown' 
  for hcode in tl.keys(): 
    numOfBytes = len(hcode) / 2 # 需要读多少字节 
    binfile.seek(0) # 每次读取都要回到文件头,不然会一直往后读取 
    hbytes = struct.unpack_from("B"*numOfBytes, binfile.read(numOfBytes)) # 一个 "B"表示一个字节 
    f_hcode = bytes2hex(hbytes) 
    if f_hcode == hcode: 
      ftype = tl[hcode] 
      break 
  binfile.close() 
  return ftype 
 
if __name__ == '__main__': 
  print filetype(Your-file-path)

常见文件格式的文件头

文件格式 文件头(十六进制)
JPEG (jpg) FFD8FF
PNG (png) 89504E47
GIF (gif) 47494638
TIFF (tif) 49492A00
Windows Bitmap (bmp) 424D
CAD (dwg) 41433130
Adobe Photoshop (psd) 38425053
Rich Text Format (rtf) 7B5C727466
XML (xml) 3C3F786D6C
HTML (html) 68746D6C3E
Email [thorough only] (eml) 44656C69766572792D646174653A
Outlook Express (dbx) CFAD12FEC5FD746F
Outlook (pst) 2142444E
MS Word/Excel (xls.or.doc) D0CF11E0
MS Access (mdb) 5374616E64617264204A

以上就是本文的全部内容,希望对大家的学习有所帮助。

Python 相关文章推荐
Python的Django框架中消息通知的计数器实现教程
Jun 13 Python
一个基于flask的web应用诞生(1)
Apr 11 Python
python 类对象和实例对象动态添加方法(分享)
Dec 31 Python
Linux系统(CentOS)下python2.7.10安装
Sep 26 Python
在Pycharm中对代码进行注释和缩进的方法详解
Jan 20 Python
PyCharm 创建指定版本的 Django(超详图解教程)
Jun 18 Python
深入了解Django View(视图系统)
Jul 23 Python
详解python 利用echarts画地图(热力图)(世界地图,省市地图,区县地图)
Aug 06 Python
Python使用grequests(gevent+requests)并发发送请求过程解析
Sep 25 Python
解决Python 异常TypeError: cannot concatenate 'str' and 'int' objects
Apr 08 Python
pip已经安装好第三方库但pycharm中import时还是标红的解决方案
Oct 09 Python
Django数据模型中on_delete使用详解
Nov 30 Python
python制作花瓣网美女图片爬虫
Oct 28 #Python
python制作最美应用的爬虫
Oct 28 #Python
python使用wmi模块获取windows下的系统信息 监控系统
Oct 27 #Python
详解JavaScript编程中的window与window.screen对象
Oct 26 #Python
深入讲解Python中的迭代器和生成器
Oct 26 #Python
Windows下使Python2.x版本的解释器与3.x共存的方法
Oct 25 #Python
解析Python编程中的包结构
Oct 25 #Python
You might like
收音机史话 - 1960年代前后的DIY
2021/03/02 无线电
用户的详细注册和判断
2006/10/09 PHP
thinkphp模板继承实例简述
2014/11/26 PHP
php官方微信接口大全(微信支付、微信红包、微信摇一摇、微信小店)
2015/12/21 PHP
PHP基于GD库实现的生成图片缩略图函数示例
2017/07/05 PHP
php实现的表单验证类完整示例
2019/08/13 PHP
php设计模式之模板模式实例分析【星际争霸游戏案例】
2020/03/24 PHP
BOOM vs RR BO5 第三场 2.14
2021/03/10 DOTA
js 图片缩放(按比例)控制代码
2009/05/27 Javascript
Jquery下:nth-child(an+b)的使用注意
2011/05/28 Javascript
node.js chat程序如何实现Ajax long-polling长链接刷新模式
2012/03/13 Javascript
jQuery实现单击和鼠标感应事件
2015/02/01 Javascript
javascript生成随机数方法汇总
2015/11/12 Javascript
jQuery实现的图片轮播效果完整示例
2016/09/12 Javascript
jquery插件bootstrapValidator数据验证详解
2016/11/09 Javascript
babel基本使用详解
2017/02/17 Javascript
vue页面使用阿里oss上传功能的实例(二)
2017/08/09 Javascript
js防刷新的倒计时代码 js倒计时代码
2017/09/06 Javascript
浅谈React Native Flexbox布局(小结)
2018/01/08 Javascript
vue-cli的build的文件夹下没有dev-server.js文件配置mock数据的方法
2019/04/17 Javascript
nodejs实现聊天机器人功能
2019/09/19 NodeJs
Python实现远程调用MetaSploit的方法
2014/08/22 Python
python-opencv在有噪音的情况下提取图像的轮廓实例
2017/08/30 Python
python合并同类型excel表格的方法
2018/04/01 Python
对pandas中时间窗函数rolling的使用详解
2018/11/28 Python
selenium+python自动化测试之多窗口切换
2019/01/23 Python
Django通用类视图实现忘记密码重置密码功能示例
2019/12/17 Python
python实现飞船游戏的纵向移动
2020/04/24 Python
基于django和dropzone.js实现上传文件
2020/11/24 Python
Django权限控制的使用
2021/01/07 Python
在html5的Canvas上绘制椭圆的几种方法总结
2013/01/07 HTML / CSS
eDreams加拿大:廉价航班、酒店和度假
2019/03/29 全球购物
Fnac西班牙官网:法国文化和电子产品零售商
2021/03/14 全球购物
生育关怀行动实施方案
2014/03/26 职场文书
幼儿园工作总结2015
2015/04/01 职场文书
解析在浏览器地址栏输入一个URL后发生了什么
2021/06/21 Servers