如何使用python-magic 5.19-1

8 投票
1 回答
32340 浏览
提问于 2025-04-18 17:08

我需要在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_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'

撰写回答