使用Python获取文件夹内所有文件的MIME类型
按MIME类型为无扩展名文件批量添加正确扩展名
问题场景
文件夹里存了一堆没有扩展名的文件,类型涵盖mp4、png等,需要根据MIME类型自动分类并添加对应扩展名,但用内置的mimetypes库直接传文件路径列表时触发错误:
TypeError: expected str, bytes or os.PathLike object, not list
错误原因
mimetypes模块的核心方法(比如guess_type())只支持单个文件路径作为参数,不能直接传入列表,必须遍历文件夹内的文件逐个处理。另外要注意:mimetypes是靠文件扩展名或已知映射表猜类型,无扩展名时准确率有限,更靠谱的方式是读取文件头判断真实MIME类型。
解决方法
方法1:用内置库遍历处理(适合简单场景)
先遍历文件夹里的所有文件,逐个获取MIME类型后重命名:
import os import mimetypes folder_path = "/path/to/your/folder" for filename in os.listdir(folder_path): file_path = os.path.join(folder_path, filename) # 跳过文件夹,只处理文件 if os.path.isfile(file_path): mime_type, _ = mimetypes.guess_type(file_path) if mime_type: # 根据MIME类型获取对应的扩展名 ext = mimetypes.guess_extension(mime_type) if ext: new_filename = f"{filename}{ext}" new_file_path = os.path.join(folder_path, new_filename) os.rename(file_path, new_file_path)
方法2:用python-magic读取文件头(准确率更高)
因为无扩展名时mimetypes判断可能不准,推荐用python-magic库读取文件二进制头来获取真实MIME类型:
- 先安装库:
pip install python-magic # 部分Linux系统可能需要先安装系统依赖:sudo apt install libmagic1
- 实现代码:
import os import magic folder_path = "/path/to/your/folder" mime = magic.Magic(mime=True) for filename in os.listdir(folder_path): file_path = os.path.join(folder_path, filename) if os.path.isfile(file_path): mime_type = mime.from_file(file_path) # 映射MIME类型到扩展名(可根据需要补充更多类型) mime_to_ext = { "video/mp4": ".mp4", "image/png": ".png", "image/jpeg": ".jpg", "text/plain": ".txt", "application/pdf": ".pdf" } ext = mime_to_ext.get(mime_type) if ext: new_file_path = os.path.join(folder_path, f"{filename}{ext}") os.rename(file_path, new_file_path)
补充说明:用户Jay的评论解决了我的问题,核心思路就是通过遍历逐个处理文件,同时推荐了用文件头判断MIME类型的更可靠方案。
内容的提问来源于stack exchange,提问作者Mr. Pekr
相关产品推荐
相关产品推荐

