8

我需要从 python3 中没有后缀的文件中确定 MIME 类型,我认为 python-magic 是一个合适的解决方案。不幸的是,它不像这里描述的那样工作: https ://github.com/ahupp/python-magic/blob/master/README.md

会发生什么:

>>> import magic
>>> magic.from_file("testdata/test.pdf")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'from_file'

所以我看了一下对象,它为我提供了Magic我在这里找到文档的类:http: //filemagic.readthedocs.org/en/latest/guide.html

我很惊讶,这也不起作用:

>>> with magic.Magic() as m:
...     pass
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: __init__() missing 1 required positional argument: 'ms'
>>> m = magic.Magic()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: __init__() missing 1 required positional argument: 'ms'
>>> 

我找不到任何关于如何在Magic任何地方使用该类的信息,所以我继续反复试验,直到我发现它只接受LP_magic_setfor 的实例ms。其中一些是由模块的方法 magic.magic_set()magic_t(). 所以我试图Magic用他们中的任何一个来实例化。然后当我从实例调用该file()方法时,它总是返回一个空结果,并且该errlvl()方法告诉我错误号。22. 那么我到底该怎么使用魔法呢?

4

1 回答 1

17

我认为您混淆了“python-magic”的不同实现

您似乎已经安装了python-magic-5.19.1,但是,您首先参考了python-magic- 0.4.6 的文档,然后是filemagic-1.6。我认为你最好使用 python-magic-0.4.6,因为它在 PYPI 上很容易获得,并且很容易通过pipvirtualenv 环境安装。

python-magic-5.19.1 的文档很难获得,但我设法让它像这样工作:

>>> import magic
>>> m=magic.open(magic.MAGIC_NONE)
>>> m.load()
0
>>> m.file('/etc/passwd')
'ASCII text'
>>> m.file('/usr/share/cups/data/default.pdf')
'PDF document, version 1.5'

您还可以获得不同的魔法描述,例如 MIME 类型:

>>> m=magic.open(magic.MAGIC_MIME)
>>> m.load()
0
>>> m.file('/etc/passwd')
'text/plain; charset=us-ascii'
>>> m.file('/usr/share/cups/data/default.pdf')
'application/pdf; charset=binary'

或更新的版本python-magic-5.30

>>> import magic
>>> magic.detect_from_filename('/etc/passwd')
FileMagic(mime_type='text/plain', encoding='us-ascii', name='ASCII text')
>>> magic.detect_from_filename('/etc/passwd').mime_type
'text/plain'
于 2014-08-13T13:25:25.723 回答