Python 中如何从文件名提取扩展名?
提取文件扩展名推荐 os.path.splitext()(返回带点扩展名)或 pathlib 的 Path.suffix 属性。本文对比两种标准做法及字符串切片的局限性。
推荐用标准库:os.path.splitext(filename)[1] 得到扩展名(带点,如 .txt);pathlib 风格用 Path(filename).suffix。不要用字符串切片手动切——遇到无扩展名文件会出错。
方法一:os.path.splitext
import os
filename = "example.txt"
extension = os.path.splitext(filename)[1]
print(extension) # .txt
返回元组 ('example', '.txt'),取索引 1 即扩展名(带点)。无扩展名时返回空字符串,不会报错。
方法二:pathlib(更现代)
from pathlib import Path
p = Path("example.txt")
print(p.suffix) # .txt
print(p.stem) # example(不含扩展名的主名)
还有 suffixes(所有后缀,如 .tar.gz 返回 ['.tar', '.gz'])。
为什么不推荐字符串切片
filename[filename.index(".")+1:] # 文件名没有点会抛 ValueError
splitext 对各种边界情况(无扩展名、以点开头的隐藏文件如 .gitignore)都有正确处理,手写切片容易踩坑。
常见问题(FAQ)
Q:想拿到不带点的扩展名?
A:os.path.splitext(f)[1].lstrip('.') 或 Path(f).suffix[1:]。
Q:.tar.gz 这种双重扩展名怎么办?
A:splitext 只认最后一个点,返回 .gz;要全部后缀用 Path(f).suffixes。
Q:隐藏文件 .gitignore 会被误判吗?
A:不会。splitext('.gitignore') 把整名当主名,扩展名为空——这正是期望行为。