判断文件的真实格式
对一个文件来说,文件的后缀是可以随意修改的,但是如果改的时间比较长,可能就不知道原本的文件格式是啥,不匹配的文件格式,在Windows上,大多数情况是无法正常打开的。因此可以根据文件前几个字符的特征码来判断文件真实的格式

# -*- coding:utf-8 -*-
# @FileName :file_type.py
# @DateTime :2022/4/29 10:44
# @Author   :wanglb
import struct

type_dict = {
    '424D': 'bmp',
    'FFD8FF': 'jpg',
    '2E524D46': 'rm',
    '4D546864': 'mid',
    '89504E47': 'png',
    '47494638': 'gif',
    '49492A00': 'tif',
    '41433130': 'dwg',
    '38425053': 'psd',
    '2142444E': 'pst',
    'FF575043': 'wpd',
    'AC9EBD8F': 'qdf',
    'E3828596': 'pwl',
    '504B0304': 'zip',
    '52617221': 'rar',
    '57415645': 'wav',
    '41564920': 'avi',
    '2E7261FD': 'ram',
    '000001BA': 'mpg',
    '000001B3': 'mpg',
    '6D6F6F76': 'mov',
    '7B5C727466': 'rtf',
    '3C3F786D6C': 'xml',
    '68746D6C3E': 'html',
    'D0CF11E0': 'doc/xls',
    '255044462D312E': 'pdf',
    'CFAD12FEC5FD746F': 'dbx',
    '3026B2758E66CF11': 'asf',
    '5374616E64617264204A': 'mdb',
    '252150532D41646F6265': 'ps/eps',
    '44656C69766572792D646174653A': 'eml'
}
max_len = len(max(type_dict, key=len)) // 2


def get_filetype(filename):
    # 读取二进制文件开头一定的长度
    with open(filename, 'rb') as f:
        byte = f.read(max_len)
    # 解析为元组
    byte_list = struct.unpack('B' * max_len, byte)
    # 转为16进制
    code = ''.join([('%X' % each).zfill(2) for each in byte_list])
    # 根据标识符筛选判断文件格式
    result = list(filter(lambda x: code.startswith(x), type_dict))
    if result:
        return type_dict[result[0]]
    else:
        return 'unknown'


if __name__ == '__main__':
    p = r'D:\pic1.rar''
    print(get_filetype(p))

返回结果为 rar
如果我手动修改了文件的后缀,程序运行结果依旧是rar,可以方便我们对于一个文件真实格式的判断

另一个使用场景为,一个png格式的图片,如果手动改为jpg格式,虽然可以正常打开,但是在某些程序中,运行可能就会不正常,因此,文件的真实格式还是非常重要的

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐