最可靠的做法是用 python-magic 识别 mime 类型再映射后缀,因 os.path.splitext 无法处理无后缀文件、关键词误判及跨平台注册表依赖,唯有 magic bytes 能真实反映文件内容;需配合 mimetypes.guess_extension 并显式覆盖高频类型,重命名前校验路径并用 shutil.move 提升健壮性。

直接用 python-magic 识别 MIME 类型,再按类型映射后缀,是最可靠的做法——操作系统文件扩展名不可信,file 命令输出也不稳定,只有二进制头部解析才能真正判断内容。
为什么不能只靠文件名或 os.path.splitext?
无后缀文件(如 IMG_1234、video001)的 os.path.splitext 返回空字符串,无法推断类型;仅看文件名里的关键词(如 “jpg”、“mp4”)极易误判;Windows 的注册表关联或 macOS 的 mdls 输出依赖系统状态,跨平台失效。
真正有效的依据是文件开头的 magic bytes。Python 中最成熟的选择是 python-magic(libmagic 绑定),它复用了 Unix file 命令背后的数据库,覆盖 99% 常见媒体格式。
安装与基础识别:避开 Windows 下的 dll 陷阱
python-magic 在 Windows 上默认不带 libmagic DLL,直接 pip install python-magic 会报 magic.MagicException: could not find any magic files!。
- Windows 用户必须额外安装
python-magic-bin:pip uninstall python-magic && pip install python-magic-bin - macOS / Linux 用户建议用系统级 libmagic:
brew install libmagic(macOS)或apt-get install libmagic1(Ubuntu),再装python-magic - 初始化时显式指定路径可避免自动探测失败:
magic.Magic(magic_file="/usr/share/misc/magic.mgc")
按 MIME 映射后缀:别硬编码,用 mimetypes 模块兜底
python-magic 返回的是 MIME 字符串(如 "image/jpeg"、"video/mp4"),但不是所有 MIME 都有标准后缀,且同一 MIME 可能对应多个后缀(如 "image/jpeg" → .jpg 或 .jpeg)。
推荐组合使用:mimetypes.guess_extension() 提供安全默认值,再手动覆盖高频媒体类型:
import magic
import mimetypes
<p>mime = magic.Magic(mime=True)
mimetype = mime.from_file("IMG_1234") # → "image/jpeg"</p><h1>兜底 + 覆盖</h1><p>ext = mimetypes.guess_extension(mimetype) or ".bin"
if mimetype == "image/jpeg":
ext = ".jpg"
elif mimetype == "video/mp4":
ext = ".mp4"
elif mimetype == "audio/mpeg":
ext = ".mp3"</p>
注意:mimetypes.guess_extension("image/jpeg") 可能返回 ".jpe"(极少见),所以关键类型必须显式指定。
重命名前务必校验:避免覆盖或破坏原文件
直接 os.rename() 风险高——目标文件已存在、权限不足、路径含非法字符都会中断流程,且无法回退。
- 先用
os.path.exists()检查新路径是否已存在,存在则跳过或加序号(如IMG_1234.jpg.1) - 用
shutil.move()替代os.rename(),它在跨文件系统时自动 fallback 到 copy+delete,更健壮 - 重命名前用
pathlib.Path(file).with_suffix(ext)构造目标路径,比字符串拼接更安全 - 对批量操作加 try/except,并记录失败文件和错误原因(如
OSError: [Errno 13] Permission denied)
真实场景中,有些设备导出的“视频”其实是 HEIF 格式(image/heic),但 Windows 资源管理器不认,重命名为 .heic 后仍打不开——这时候得提醒用户安装 HEIF 插件,而不是强行改成 .jpg。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











