我正在编写一个Python脚本,将大量Windows安装程序编入索引。
我想知道如何使用在Linux上运行的Python从EXE,MSI和ZIP文件中读取元数据信息(公司,产品名称,版本等)。
我在Ubuntu 10.04 64位和Django 1.2.1上使用Python 2.6.5。
Windows命令行实用程序,可以提取EXE元数据(如来自SysUtils的filever)或仅在Windows中工作的其他单个CL utils。我尝试通过Wine运行它们但是它们有问题,并且不值得去找那些CL utils所依赖的库和框架并尝试在Wine / Crossover中安装它们。
用于Python的Win32模块可以执行某些操作但不能在Linux中运行(对吗?)
显然,更改文件的元数据会更改文件的MD5哈希值。是否有一种通用的方法来散列独立于元数据的文件,除了定位和读取它(例如:跳过前1024个字节?)
这是我在这里发表StackOverflow的第一篇文章。从我作为一名新的Python开发人员的最新工作开始,我对Stackoverflow印象非常深刻,并且它一直出现在谷歌搜索我的Python / Django查询的顶部,并且具有高质量的答案。感谢这个社区。 p>
答案 0 :(得分:4)
看看这个库:http://bitbucket.org/haypo/hachoir/wiki/Home以及使用该库的示例程序:http://pypi.python.org/pypi/hachoir-metadata/1.3.3。第二个链接是一个示例程序,它使用Hachoir
二进制文件操作库(第一个链接)来解析元数据。
图书馆可以处理以下格式:
此外,Hachoir
可以执行一些文件操作操作,我认为这包括一些原始元数据操作。
答案 1 :(得分:2)
hachoir-metadata获取“产品版本”,但编译器更改了“文件版本”。 然后返回的版本不是我们需要的。
我找到了一个很好的解决方案:
我已成功测试过。它简单,快速,稳定。
答案 2 :(得分:1)
要回答您的一个问题,您可以使用zipfile module,特别是ZipInfo对象来获取zip文件的元数据。
至于只散列文件的数据,只有知道哪些部分是数据,哪些部分是元数据,才能进行散列。由于许多文件格式以不同方式存储元数据,因此没有通用方法。
答案 3 :(得分:1)
回答第二个问题:不,没有定位和读取元数据,就无法散列PE文件或ZIP文件,忽略元数据。这是因为您感兴趣的元数据存储在文件中的可变位置。
对于PE文件(EXE,DLL等),它存储在资源块中,通常位于文件末尾,文件开头的一系列指针和表格给出了位置。 / p>
对于ZIP文件,它分散在整个存档中 - 每个包含的文件前面都有自己的元数据,然后在最后给出一个表格,给出每个元数据块的位置。但听起来你可能真的想要读取ZIP存档中的文件,如果你正在追踪程序元数据,那么在那里寻找EXE; ZIP存档本身不存储公司名称或版本号。