如何从文件类型中获取文件扩展名?

11

我有一个以下的文件名列表

files = [
    '/dl/files/4j55eeer_wq3wxxpiqm.jpg',
    '/home/Desktop/hjsd03wnsbdr9rk3k',
    'kd0dje7cmidj0xks03nd8nd8a3',
    ...
]

问题在于大部分文件名没有扩展名,那么获取这些文件的文件扩展名的最佳方法是什么?

我不知道这是否可能,因为Python会将所有文件视为没有与之关联的文件类型的缓冲区或字符串对象。

这个能做到吗?


1
获取文件的MIME类型,但这只会给你类型而不是扩展名。 - 0xAli
这个需要可移植吗?UNIX的file通常非常擅长查找文件类型... - Bakuriu
1
@Bakuriu: file 使用 libmagic,而且它是跨平台的。请参见 John Zwinck 下面链接的 python-magic 库。 - Martijn Pieters
3个回答

17

为什么 guess_extension 对于 mimetype image/jpeg 返回 *.jpe,它是否只是在 '/' 上分割并返回第二个元素的前三个字符,再前缀加上 . 呢? - Amyth
@Amyth:它的名字中确实有“猜测”一词,因此可以稍微放宽要求。 - Ignacio Vazquez-Abrams
明白了,但我觉得 return '.' + mime.split('/')[1] 会返回更精确的结果,你说呢? - Amyth
2
不行,因为text/plain不应该使用.pla作为文件扩展名。 - Ignacio Vazquez-Abrams
2
@Amyth:它返回“.jpe”的原因是因为“*.jpe”是“image/jpeg” mimetype的许多有效扩展名之一。如果您改用mimetypes.guess_all_extensions(),则会看到整个可能性列表。似乎mimetypes.guess_extension()只取此列表的第一个元素。这也是猜测“text/plain” mimetype时返回“.h”而不是显而易见的“.txt”的原因。 - pR0Ps

3
如果您拥有一个能够根据文件内容确定文件类型的oracle,那么这是可行的。令人高兴的是,至少有一个这样的oracle已经在Python中实现:https://github.com/ahupp/python-magic

1
以下代码对我有效:
import filetype

fileinfo = filetype.guess(mock.jpg) #the argument can be buffer/file
detectedExt = fileinfo.extension
detectedmime = fileinfo.mime

文件类型包文档


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接