2023年11月28日发(作者:)

python3通过⽂件头判断⽂件类型

最近,在学习python3中,感觉⼊门挺简单,毕竟本⾝是java开发,很多容易理解⼀些东西。

这⼏天对⽂件类型的验证有点想法,就在⽹上搜索,是找到了很多博客,但是感觉他们很多内容都⼀样。就复制了⼀个,在本地跑,结果报

错。

⽹上的,因为是python3做了⼀点修改:

1import struct

2

3# ⽀持⽂件类型

4# 16进制字符串的⽬的是可以知道⽂件头是多少字节

5# 各种⽂件头的长度不⼀样,少半2字符,长则8字符

6def typeList():

7 return {

8 "52617221": EXT_RAR,

9 "504B0304": EXT_ZIP}

10

11# 字节码转16进制字符串

12def bytes2hex(bytes):

13 num = len(bytes)

14 hexstr = u""

15 for i in range(num):

16 t = u"%x" % bytes[i]

17 if len(t) % 2:

18 hexstr += u"0"

19 hexstr += t

20 return ()

21

22# 获取⽂件类型

23def filetype(filename):

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

25 tl = typeList()

26 ftype = 'unknown'

27 for hcode in ():

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

29 (0) # 每次读取都要回到⽂件头,不然会⼀直往后读取

30 hbytes = _from("B"*numOfBytes, (numOfBytes)) # ⼀个 "B"表⽰⼀个字节

31 f_hcode = bytes2hex(hbytes)

32 if f_hcode == hcode:

33 ftype = tl[hcode]

这样好⿇烦,再接着查python3原⽣的⽂件操作,open函数:/python/python_files_

以下是打开⽂件使⽤的模式的列表 -

1r打开的⽂件为只读模式。⽂件指针位于⽂件的开头,这是默认模式。

2

r

b

r

+

r

4b

+

5w

w

b

w

+

w

8b

+

9a

a

b

a

+

a

12b

+

打开仅供写⼊的⽂件。 如果⽂件存在,则覆盖该⽂件。 如果⽂件不存在,则创建⼀个新⽂件进⾏写

⼊。

打开仅⽤⼆进制格式写⼊的⽂件。如果⽂件存在,则覆盖该⽂件。 如果⽂件不存在,则创建⼀个新⽂

件进⾏写⼊。

打开写⼊和取读的⽂件。如果⽂件存在,则覆盖现有⽂件。 如果⽂件不存在,创建⼀个新⽂件进⾏阅

读和写⼊。

以⼆进制格式打开⼀个⽤于读写⽂件。⽂件指针放在⽂件的开头。

描述

打开仅⽤⼆进制格式读取的⽂件。⽂件指针位于⽂件的开头,这是默认模式。

做⽬录遍历⽂件扫描,就有验证到要扫描的路径可能指向⽂件,现在可以把这个合并在⼀起,可以做到控制台输⼊⽂件路径验证⽂件格式,

输⼊⽬录遍历⽂件。两全其美,真好:

1# coding:utf-8

2# WinSonZhao

3import os

4

5

6# ⽀持⽂件类型

7# 16进制字符串的⽬的是可以知道⽂件头是多少字节

8# 各种⽂件头的长度不⼀样,少半2字符,长则8字符

9def typeList():

10 print('获取⽂件格式⼗六进制码表……');

11 return {

62 '504b0800':'docx',

63 'd0cf11e0a1b11ae10000':'wps',

64 '6431303a637265617465':'torrent',

65 }

66

67

68# 字节码转16进制字符串

69def bytes2hex(bytes):

70 print('关键码转码……');

71 num = len(bytes)

72 hexstr = u""

73 for i in range(num):

74 t = u"%x" % bytes[i]

75 if len(t) % 2:

76 hexstr += u"0"

77 hexstr += t

78 return ()

79

80

81# 获取⽂件类型

82def filetype(filename):

83 print('读⽂件⼆进制码中……');

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

85 print('提取关键码……');

86 bins = (20) #提取20个字符

87 () #关闭⽂件流

88 bins = bytes2hex(bins) #转码

89 bins = ()#⼩写

90 print(bins);

91 tl = typeList() #⽂件类型

127 print((p));

128 for n in fs:

129 n=('.');

130 print('t'+n[0]+'t'+n[1]);

131if __name__ == '__main__':

132 print('WinSonZhao,欢迎你使⽤⽂件扫描⼯具……');

133 path=input('请输⼊要扫描的⽂件夹路径:');

134 filescanner(path);

135 print('扫描结束!');

81CDAB=wpf

4C4E0200=gid,hlp

FFFE0000=n,a

414F4C4442=aby

3026b2758e66cf11a6d9=wmv