最新新闻,最快送达

使用Python确定文件格式

  • 发布时间:2020-09-29
  • 来源:中培教育网

  很多人都遇见过这样的问题,存储卡开始将所有文件移至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)

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

  \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

  项目页面上还有用法示例和受支持的文件格式的完整列表。

  上述就是关于使用Python确定文件格式的全部内容介绍,想了解更多关于Python的信息,请继续关注中培教育。

近期开班

phone
全国报名服务热线: 400-626-7377
合作伙伴
  • 国际APMG组织
  • 思科(Cisco)
  • 国际OPEN GROUP组织
  • 国家外专局培训中心
  • 上海银行
  • 中国石油管道局工程有限公司
  • 朗新科技
  • 中国国家博物馆
金牌客户
  • 中国石油天然气集团公司
  • 中国农业银行
  • 中国建设银行
  • 波司登集团
  • 浙江移动
合作机构
  • 美国项目管理协会
  • 人力资源和社会保障部
  • 中华人民共和国工业和信息化部
  • 中国计算机技术职业资格网
  • CITIF中国电子信息行业联合会
  • PEOPLECERT
微信公众号
公众号

微信号:zpitedu

  • 中培教育 Copyright © 2006-2020 北京中培伟业管理咨询有限公司 .All Rights Reserved
  • 京ICP备13024721号  gonganimg  京公网安备11010602007294号  增值电信业务经营许可证:京B2-20201348  全国统一报名专线:400-626-7377