python3 解析文件类型filetype

python3 解析文件类型filetype

更多相关文件头可查询https://filesignatures.net/

以下是个人理解,错了请大神轻喷

  1. 文本文件例如txt,java,html,js ,css,py等没有特定的文件头,没办法通过文件头判断
  2. 空文件没有文件头
# coding:utf-8
# 支持文件类型
# 用16进制字符串的目的是可以知道文件头是多少字节
# 各种文件头的长度不一样,空文件没有文件头
#文本文件例如txt,java,html,js ,css,py等没有文件头

import os
def typeList():
    return {
        'FFD8FF': 'JPEG (jpg)',
        '89504E47': 'PNG (png)',
        '47494638': 'GIF (gif)',
        '49492A00': 'TIFF (tif)',
        '424D': 'Windows Bitmap (bmp)',
        '41433130': 'CAD (dwg)',
        '38425053': 'Adobe Photoshop (psd)',
        '3C3F786D6C2076657273696F6E3D': 'XML (xml)',#判断<?xml version="1.0"
        '582D': 'Email [thorough only] (eml)',
        'D0CF11E0A1B11AE1': 'MS Word/Excel (xls.or.doc)',
        '25504446': 'Adobe Acrobat (pdf)',
        '504B0304': 'ZIP Archive (zip) or DOCX',
        '52617221': 'RAR Archive (rar)',
        '52494646': 'Wave/AVI (wav or avi)',
        '4D5A': 'EXE',
        '494433': 'MP3',
        '5F27A889': 'JAR',
        '00000020667479704D3441': 'M4A'
    }


# 字节码转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')  # 二制字读取
    bins = binfile.read(14)  # 提取28个字符
    binfile.close()  # 关闭文件流
    bins = bytes2hex(bins)  # 转码
    print(bins)
    tl = typeList()
    ftype = 'unknown'
    for hcode in tl.keys():
        lens = len(hcode)  # 需要读多少字节
        if bins[0:lens] == hcode:
            ftype = tl[hcode]
            break
    return ftype


#文件扫描,如果是目录,就将遍历文件,是文件就判断文件类型
def filescanner(path:str):
    if os.path.isfile(path):
        if path.rfind('.') > 0:
            print('文件名:', os.path.split(path)[1])
        else:
            print('文件名中没有找到格式')
        path = filetype(path)
        print('解析文件格式:' + path)
    elif os.path.isdir(path):
        print('开始遍历文件')
        for root, dirs, files in os.walk(path):
            for file in files:
                path = os.path.join(root, file)
                filename = os.path.split(path)[1]
                origin_extension = filename.split('.')[1]
                print('文件名:', path)
                extension = filetype(path)
                if extension=='unknown':
                    print('格式未知,暂定为原格式:' + origin_extension)
                else:
                    print('解析文件格式:' + extension)
                print('')

if __name__ == '__main__':
    filescanner(r'E:\工具箱\通过文件头判断文件类型')

参考文章:https://blog.csdn.net/privateobject/article/details/78069500

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值