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


发布评论