如何使用python-magic 5.19-1
我需要在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
的类,我在这里找到了相关文档:
我很惊讶,这个也没有用:
>>> 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_set
的实例用于 ms
。
其中一些是通过模块的方法 magic.magic_set()
和 magic_t()
返回的。
于是我尝试用这两个方法中的任意一个来实例化 Magic
。
当我从这个实例调用 file()
方法时,它总是返回一个空结果,而 errlvl()
方法告诉我错误号是22。
那么,我到底该怎么使用magic呢?
1 个回答
18
我觉得你可能搞混了“python-magic”的不同版本。
你似乎安装的是 python-magic-5.19.1,但是你首先参考的是 python-magic-0.4.6 的文档,其次是 filemagic-1.6。我认为你使用 python-magic-0.4.6 会更好,因为它在 PYPI 上很容易找到,并且可以通过 pip
很方便地安装到虚拟环境中。
关于 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'