python准确判断文件类型

  判断文件类型在开发中非常常见的需求,怎样才能准确的判断文件类型呢?首先大家想到的是文件的后缀,但是非常遗憾的是这种方法是非常不靠谱的,因为文件的后缀是可以随意更改的,而大家都知道后缀在linux系统下是没有这个概念的,所以仅靠判断后缀无法准确判断一个文件的类型。还有第二种方法是判断文件的头,每种文件在文件的头中会标识这种文件的类型,下面我们来看看如何用python来判断文件的类型。

  python通过文件头判断文件类型的方法:

  #!/usr/bin/python

  #pythontab提醒您注意中文编码问题,指定编码为utf-8

  #-*-coding:utf-8-*-

  importstruct

  #支持文件类型

  #用16进制字符串的目的是可以知道文件头是多少字节

  #各种文件头的长度不一样,少则2字符,长则8字符

  deftypeList():

  return{

  FFD8FF:JPEG,

  89504E47:PNG}

  #字节码转16进制字符串

  defbytes2hex(bytes):

  num=len(bytes)

  hexstr=u

  foriinrange(num):

  t=u%x%bytes[i]

  iflen(t)%2:

  hexstr+=u0

  hexstr+=t

  returnhexstr.upper()

  #获取文件类型

  deffiletype(filename):

  binfile=open(filename,'rb')#必需二制字读取

  tl=typeList()

  ftype='unknown'

  forhcodeintl.keys():

  numOfBytes=len(hcode)/2#需要读多少字节

  binfile.seek(0)#每次读取都要回到文件头,不然会一直往后读取

  hbytes=struct.unpack_from(B*numOfBytes,binfile.read(numOfBytes))#一个B表示一个字节

  f_hcode=bytes2hex(hbytes)

  iff_hcode==hcode:

  ftype=tl[hcode]

  break

  binfile.close()

  returnftype

  if__name__=='__main__':

  printfiletype('./test.jpg')

  常见文件格式的文件头

  文件格式文件头(十六进制)

  JPEG(jpg)FFD8FF

  PNG(png)89504E47

  GIF(gif)47494638

  TIFF(tif)49492A00

  WindowsBitmap(bmp)424D

  CAD(dwg)41433130

  AdobePhotoshop(psd)38425053

  RichTextFormat(rtf)7B5C727466

  XML(xml)3C3F786D6C

  HTML(html)68746D6C3E

  Email[thoroughonly](eml)44656C69766572792D646174653A

  OutlookExpress(dbx)CFAD12FEC5FD746F

  Outlook(pst)2142444E

  MSWord/Excel(xls.or.doc)D0CF11E0

  MSAccess(mdb)5374616E64617264204A


转载于:https://juejin.im/post/5bd6d2bee51d4545993212ef

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值