python3 解析文件类型filetype
更多相关文件头可查询https://filesignatures.net/
以下是个人理解,错了请大神轻喷
- 文本文件例如txt,java,html,js ,css,py等没有特定的文件头,没办法通过文件头判断
- 空文件没有文件头
# 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