精选文章

使用Python确定文件格式

2020-09-29 11:21:30 | 来源:中培企业IT培训网

很多人都遇见过这样的问题,存储卡开始将所有文件移至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的信息,请继续关注中培伟业。

标签: Python 软件研发