使用Python确定文件格式

很多人都遇见过这样的问题,存储卡开始将所有文件移至LOST.DIR文件夹,没有任何扩展名。长期以来,这里积累了500多种不同类型的文件:图片,视频,音频,文档。不可能单独理解文件的格式,因此我开始寻找一种以编程方式解决此问题的方法。下面我们就来介绍一下如何使用Python确定文件格式的方法信息,想知道的请继续往下看。

使用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的信息,请继续关注。

18
164
0
88

相关资讯

  1. 1、搜书大师怎么设置标注?搜书大师设置标注的方法1534
  2. 2、Win7提示“显示器驱动程序已停止响应并且已成功恢复”怎么办?3421
  3. 3、安装Win11一直转圈怎么办?安装Win11一直转圈解决方法3096
  4. 4、大白菜如何装Win10系统?大白菜装Win10系统的方法3623
  5. 5、拯救手残党!微信取消两分钟内删除功能,确认方法在这里!4814
  6. 6、Win10硬盘分区怎么分?Win10硬盘分区合并教程2443
  7. 7、HTTP错误403.1禁止访问怎么办?2016
  8. 8、悦动圈怎么绑定手机号?悦动圈手机号绑定教程1187
  9. 9、笔记本Win10系统睡眠后唤醒自动重启问题的解决方法2567
  10. 10、百度阅读怎么开启护眼模式?百度阅读护眼模式开启方法724
全部评论(0)
我也有话说
0
收藏
点赞
顶部