使用Python确定文件格式

史前史

大家好! 最近,我遇到了一个问题:由于无法解释的原因,存储卡开始将所有文件移至LOST.DIR文件夹,没有任何扩展名。 长期以来,这里积累了500多种不同类型的文件:图片,视频,音频,文档。 不可能单独理解文件的格式,因此我开始寻找一种以编程方式解决此问题的方法。

寻找决定

我不想以Web服务或程序的形式使用现成的解决方案,因此有一个想法是编写一个控制台实用程序,该实用程序将遍历所有文件并自动安装扩展。 选择Python编写实用程序。 由于以下几个原因,未找到合适的模块和库:

  • 缺乏开发商的支持
  • 功能过多
  • 缺乏对Python新版本的支持
  • 代码过于复杂

在众多库中,python-magic非常受欢迎(在GitHub上几乎有1000颗星)。 它是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.编制数据清单

作为数据列表,我决定使用带有'data'对象的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)

如果打印“文件”变量,将看到类似以下内容:

\x90\x00\x03\x00\x00\x00\x04

现在必须将字节转换为十六进制系统:

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

GitHub项目页面上还有用法示例和受支持的文件格式的完整列表。
我每天都会改善fleep,添加新功能和格式。 您可以在项目中使用它:)

感谢您的关注!

PS:很高兴听到您对我的模块的意见。
PPS英语不是我的母语,因此,如有任何错误,请原谅:)

翻译自: https://hackernoon.com/determining-file-format-using-python-c4e7b18d4fc4

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值