很多人都遇见过这样的问题,存储卡开始将所有文件移至LOST.DIR文件夹,没有任何扩展名。长期以来,这里积累了500多种不同类型的文件:图片,视频,音频,文档。不可能单独理解文件的格式,因此我开始寻找一种以编程方式解决此问题的方法。下面我们就来介绍一下如何使用Python确定文件格式的方法信息,想知道的请继续往下看。
寻找决定
我不想以Web服务或程序的形式使用现成的解决方案,因此有一种想法来编写一个控制台实用程序,该实用程序将遍历所有文件并自动安装扩展。选择Python编写实用程序。出于以下几个原因,搜索合适的模块和库没有带来结果:
· 缺乏开发商的支持
· 功能过多
· 缺乏对Python新版本的支持
· 代码过于复杂
在许多库中,python-magic非常流行。它是libmagic库的包装器。但是,如果没有用于Unix库的DLL,就无法在Windows下使用python-magic。因此,此选项还不够好。
解决问题
从以上内容出发,我决定不使用第三方库和模块,并在没有它们的情况下解决问题。在简短搜索有关如何执行此任务的信息之后,唯一正确的方法是通过文件签名(也称为“幻数”)确定格式。
文件签名是一组字节,提供了文件格式的定义。签名具有以下十六进制形式:
50 4D 4F 43 43 4D 4F 43
幸运的是,Internet上有两个很好的站点,带有许多不同格式的签名。目标是最常见的格式。
事实证明,某些签名适用于不同的文件格式,例如Microsoft Office文件的签名。基于此,在某些情况下,有必要返回合适的文件扩展名列表。
print(get("D:\some_ms_office_document")) # prints ['doc', 'ppt', 'xls']
同样,签名通常比3GP多媒体容器之类的文件开头偏移一点。
1.编制数据清单
作为数据列表,我决定使用带有“数据”对象的JSON文件,其值将是以下形式的对象数组:
{"format": "jpg", "offset": 0, "signature": ["FF D8 FF E0", "FF D8 FF E1", "FF D8 FF E2", "FF D8 FF E8"]}
哪里:
· 格式-文件格式;
· offset —签名从文件开头的偏移量;
· 签名—用于指定文件格式的适当签名的数组。
2.编写实用程序
导入必要的模块:
import os
import json
读取数据列表:
abspath = os.path.abspath(os.path.dirname(__file__))
data = json.loads(open(os.path.join(abspath, "data.json"), "r", encoding="utf-8").read())["data"]
很好,数据列表已加载。现在,我们将文件读取为字节数组。我们只读取前32个字节,因为确定通用格式不需要更多,并且完全读取大文件将花费很长时间。
file = open("path_to_the_file", "rb").read(32)
如果打印“文件”变量,将看到类似以下内容:
x90x00x03x00x00x00x04
现在必须将字节转换为十六进制系统:
hex_bytes = " ".join(['{:02X}'.format(byte) for byte in file])
接下来,我们创建一个列表,在其中添加适当的格式:
out = []
现在,我们创建一个结构,该结构将循环确定文件格式:
for element in data:
for signature in element["signature"]:
offset = element["offset"]*2+element["offset"]
if signature == hex_bytes[offset:len(signature)+offset].upper():
out.append(element["format"])
关于此字符串:
offset = element["offset"]*2+element["offset"]
由于我们的字节用字符串表示,两个符号表示一个字节,因此我们将偏移量乘以2,然后在“字节”之间加上空格数。
对我们来说唯一剩下的就是输出适当格式的列表,该格式由'out'变量表示。
print(out) # prints something like ['extension_1', 'extension_2']
事实证明,各种项目都面临着识别文件格式的需求,因此我决定以开放源代码的形式发布我的解决方案,作为Python的模块,称为fleep link to GitHub page。您可以使用标准的python实用程序'pip'安装模块:
pip install fleep
项目页面上还有用法示例和受支持的文件格式的完整列表。
上述就是关于使用Python确定文件格式的全部内容介绍,想了解更多关于Python的信息,请继续关注中培教育。